Quiero probar una API de nodo usando Jest. Estoy probando las rutas y websockets. Probar las rutas no fue un problema. Simplemente inicié el servidor usando la opción setupFile .
Para probar los websockets quería pasar el objeto io a testing. Esto no es posible a través de setupFile ya que las pruebas se ejecutan en su propio contexto. Por lo tanto, cambié a la opción testEnvironment . Mi archivo testEnvironment es el siguiente
const NodeEnvironment = require('jest-environment-node'); class CustomEnvironment extends NodeEnvironment { constructor(config, context) { super(config, context); this.setupServer(); } async setup() { await super.setup(); console.log('Setup Test Environment.'); this.global.io = this.io; this.global.baseUrl = 'http://localhost:' + this.port; } async teardown() { await super.teardown(); console.log('Teardown Test Environment.'); } getVmContext() { return super.getVmContext(); } setupServer() { // Code for starting the server and attaching the io object this.port = portConfig.http; this.io = io; } } module.exports = CustomEnvironment; Esto funciona y el objeto io se pasa a prueba. Tengo varios archivos de prueba para diferentes partes de la API. Ejecutar aquellos con setupFile no fue un problema, pero ahora Jest solo puede ejecutar un archivo. Todos los conjuntos de pruebas siguientes están fallando con el siguiente mensaje
● Test suite failed to run TypeError: Cannot add property next, object is not extensible at Function.handle (node_modules/express/lib/router/index.js:160:12) at Function.handle (node_modules/express/lib/application.js:174:10) at new app (node_modules/express/lib/express.js:39:9)No puedo encontrar ninguna documentación sobre ese error. Intenté deshabilitar algunos de los archivos de prueba, pero siempre falla después del primero, sin importar cuál sea.
La estructura de los archivos de prueba es la siguiente, si corresponde:
const axios = require('axios'); describe('Test MODULE routes', () => { const baseUrl = global.baseUrl; const io = global.io; const models = require('../../../models'); // sequelize models which are used in tests describe('HTTP METHOD + ROUTE', () => { test('ROUTE DESCRIPTION', async () => { const response = await axios({ method: 'get', url: baseUrl + 'ROUTE' }); expect(response.status).toBe(200); }); }); // different routes });Arreglé el error. No tenía nada que ver con una broma, sino con una invocación de module.exports en la configuración del servidor que sobrescribió la exportación de CustomEnvironment con un servidor express.