No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Preparando nuestro entorno para base de datos

11/17
Recursos

Aportes 7

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Con este c贸digo y mysql en un contenedor docker pude correr las pruebas en la version 12, aunque no me cargan las variables de entorno 馃槮.

Config:

const { defineConfig } = require("cypress");
const mysql = require('mysql')

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task',{

        queryTestDb:function(query,config) {
          const connection = mysql.createConnection({
            "user":"root",
            "password":"example",
            "database":"db"
        })
          connection.connect()

          return new Promise((resolve, reject) => {
            connection.query(query,(err,results)=>{
              if(err){
                reject(err)
              } else {

                connection.end()
                return resolve(results)
              }
            })
          })
        }
      })
      // implement node event listeners here
    },
    excludeSpecPattern: [
      "cypress/e2e/getting-started/*.js",
      "cypress/e2e/advanced-examples/*.js",
    ],
    baseUrl:""
  }
});

Create dummy DATABASE

CREATE DATABASE people (id int,name varchar(255));

Test:

describe('testing database', () => {

    it('select',()=>{
        cy.task('queryTestDb',"select * from people").then((response)=>{
            cy.log(response)
        })

    })
})

Asi seria la conexi贸n mysql + cypress 12:

npm install mysql2 --save-dev

//cypress.config.js
const { defineConfig } = require('cypress');
const mysql = require('mysql2');

function queryTestDB(query) {
  const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '*******',
    database: 'MiDataBase',
  });
  connection.connect();

  return new Promise((resolve, reject) => {
    connection.query(query, (error, results) => {
      if (error) reject(error);
      else {
        connection.end();
        return resolve(results);
      }
    });
  });
}

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on) {
      on('task', {
        queryDB: (query) => {
          return queryTestDB(query);
        },
      });
    },
  },
});


//Test
describe('Haremos una conexi贸n con MySQL', () => {
  it('Debe obtener los resultados de una consulta', () => {
    cy.task('queryDB', 'SELECT * FROM ACTOR').then(
      (result) => {
        expect(result.length).to.equal(4);
      }
    );
  });
});

Prisma ORM con Cypress

.
Para este efecto, partimos de que poseemos una abstracci贸n como clase de Prisma o mediante la abstracci贸n del 馃敆 Prisma client.
.
Para poder probar ciertos casos de uso, podemos utilizar los eventos de Cypress mediante 馃摎 Plugins. Por lo que primero, empezamos a escribir nuestro plugin.
.

Nota. Para la versi贸n 10 de Cypresss, la generaci贸n de plugins dentro de la carpeta plugin esta descontinuada y soportada en el archivo cypress.config.

.
Definiendo nuestro Plugin:

import {defineConfig} from 'cypress'
import Prisma from './src/libs/Prisma'

export default defineConfig({
    e2e: {
        baseUrl: 'URL',
        setupNodeEvents(on, _) {
            on('task', {
                findMany: ({model, query}) => {
                    const client = new Prisma(model)
                    return client.findMany(query)
                },
            })
        }
    }
})

De aqu铆 importa la forma en c贸mo abstraemos nuestra Librer铆a / ORM / Driver para que seg煤n sea el caso, mock o instancia, usemos la definici贸n apropiada.
.
Luego, escribimos nuestra(s) prueba(s):

interface IPost {
    title: string
    text: string
    author: string
}

const findPosts = (posts: IPost[]) => {
    expect(posts).to.be.an('array')
    expect(posts).to.have.length.of.at.least(1)
    posts.forEach((post: IPost) => {
        expect(post).to.have.property('title')
        expect(post).to.have.property('text')
        expect(post).to.have.property('author')
    })
}

describe("Testing Prisma", () => {
    it("should works to find many posts", function () {
        cy.task("findMany", {model: 'post', query: {}})
            .then((result: any) => findPosts(result));
    });
});

En mi caso, me interesa evaluar el formato de respuesta que me entrega Prisma mediante findMany, lo que me permite evaluar la siguiente estructura de esquema:

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  text      String
  author    String
  createdAt DateTime @default(now())
  updatedAt DateTime @default(now())

  @@map("post")
}

Si no utilizan recurrentemente MySql, es posible se encuentren con errores varios de configuraci贸n. Uno de ellos, y seg煤n mi experiencia el m谩s recurrente al inicio, es: 鈥淐lient does not support authentication protocol requested by server; consider upgrading MySQL client鈥, para corregirslo, solo ejecuten la siguiente query :
" ALTER USER 鈥榬oot鈥橜鈥榣ocalhost鈥 IDENTIFIED WITH mysql_native_password BY 鈥榩assword鈥; "
en donde deben reemplazar 鈥榩assword鈥 por la contrase帽a a usar en las pruebas.

Estuve siguiendo el curso pero usando la version 12 de Cypress. Varias cosas cambian entre esta versi贸n y la que se us贸 en el curso pero los comentarios de los compa帽eros fueron de mucha ayuda 馃槂

Para las clases que requieren mongodb y mysql utilic茅 Docker, en el readme dej茅 algunos comentarios de como crear los contenedores.

https://github.com/difergo/cypressWorkshop

Tambi茅n aqu铆 hay un blog de como utilizar las variables de entorno para Cypress 10+ (est谩 en ingl茅s), 隆espero les sirva!

隆Hola!
La raz贸n de que no carga las variables de entorno es porque el config del callback setNodeEvents est谩 vac铆o.
驴Saben por qu茅?