Error de ciprés en la versión 13.6.4 | cy.task() solo debe invocarse desde el archivo de especificaciones o el archivo de soporte [cerrado]

Resuelto avin singhal asked hace 9 meses • 0 respuestas

Estoy usando la siguiente versión para la automatización de cypress.

Cypress package version: 13.6.4
Cypress binary version: 13.6.4
Electron version: 25.8.4
Bundled Node version:
18.15.0

Estoy leyendo datos del archivo Xlsx y convirtiéndolos a json y luego tengo un problema cuando ejecuto en modo --headed.

Caso 1: cuando ejecuto mi código con el comando "npx cypress run --headed" aparece un error en el navegador

cy.task() solo debe invocarse desde el archivo de especificaciones o el archivo de soporte.

Caso 2: cuando ejecuto mi código con el comando "npx cypress run", no aparece este error Lectura de datos del archivo Xlsx

Compartiendo mi código usado en cypress

  1. Se agregó una carpeta en cypress con el nombre "read-xlsx.js" y se agregó código
const XLSX = require('xlsx')
const fs = require('fs')

const readData = (testCaseIdData) => {
    try{
        const testDataFilePath = "cypress\\fixtures\\TestData.xlsx"
        // const workbook = XLSX.readFile(testDataFilePath);
        const buf = fs.readFileSync(testDataFilePath);
        const workbook = XLSX.read(buf, {type: 'buffer'})
        const sheetName = workbook.SheetNames[0]; // Assuming data is in the first sheet
        const worksheet = workbook.Sheets[sheetName];
        const jsonData = XLSX.utils.sheet_to_json(worksheet);
        // Filter JSON data based on test case ID column
        const filteredData = jsonData.filter((row) => row['TestCaseId'] === testCaseIdData);
        console.log(filteredData[0])
        return filteredData[0]
    }catch(e){
        console.log(e)
    }
}

module.exports = {
    // `on` is used to hook into various events Cypress emits
    readData,
}
  1. Se agregó otro archivo en la carpeta de complementos con el nombre "index.js" y se agregó código
const readXlsxData = require('./read-xlsx')

module.exports = (on, config) =>{
    on('task',{
        'readXlsxData': readXlsxData.readData
    })
}
  1. actualizar cypress.config.js
const { defineConfig } = require("cypress");

module.exports = defineConfig({
  chromeWebSecurity:false,
  e2e: {
    setupNodeEvents(on, config) {
      // implement node event listeners here
      return require('./cypress/plugins/index.js')(on, config)
    },
    specPattern:'cypress/e2e/practice_code.js'
  },
});

  1. Finalmente en mi archivo spec.js de prueba
describe('Reading XLSX file and converting to JSON', () => {
  it('should convert XLSX data to JSON based on test case ID column', () => {
    const testCaseIdData = 'TC_002'; // Update this with the test case ID you want to filter
    var data = cy.task('readXlsxData', testCaseIdData)
    cy.log(data)
    console.log(data)
  });
});

¡¡Por favor ayuda a resolver!!

Espero que mi resultado se imprima cuando se ejecute la prueba.

avin singhal avatar Feb 17 '24 00:02 avin singhal
Aceptado

Según la documentación de Cypress: mejores prácticas , es un antipatrón utilizar el valor devuelto de un comando, incluido cy.task().

Antipatrón: intentar asignar el valor de retorno de los comandos con const, let o var.

Mejores prácticas: utilice alias y cierres para acceder y almacenar los comandos que le generan.

Entonces tu código de prueba debería ser así:

cy.task('readXlsxData', testCaseIdData)
  .then(data => {
    cy.log(data)
    console.log(data)
  })
Phoebe avatar Feb 16 '2024 19:02 Phoebe