¿Por qué mis solicitudes HTTP en node.js fallan cuando mi servidor es inicializado por mi suite de pruebas?
He estado intentando escribir un conjunto de pruebas para mi proyecto de API de node.js y uno de sus requisitos es controlar cuándo comienza y detiene el servidor. Para eso, escribí este código a continuación con dos funciones: initializeWebServer y stopWebServer.
express.js
const initializeWebServer = () => {
return new Promise((resolve, reject) => {
app = express();
/* algunos middlewares */
app.use('/', userRoutes);
httpServer = http.createServer(app);
httpServer.listen(3000, (err) => {
if (err) {
reject(err);
return;
}
resolve(app);
});
});
};
const stopWebServer = () => {
return new Promise((resolve, reject) => {
httpServer.close(() => { resolve(); });
});
};
Usando mocha para ejecutar mis pruebas, elegí gestionar mi conexión de servidor con hooks antes y después, usando la sintaxis async/await.
user.spec.js
let axiosAPIClient;
before(async () => {
await initializeWebServer();
const axiosConfig = {
baseURL: `http://localhost:3000`,
validateStatus: () => true
};
axiosAPIClient = axios.create(axiosConfig);
});
after(async () => {
await stopWebServer();
});
describe(‘POST /api/user’, () => {
it(‘cuando se agrega un nuevo usuario, se debe recibir el aprobación con una respuesta 200’, async () => {
const userData = {
/* propiedades de usuario */
};
const response = await axiosAPIClient.post(‘/api/user’, userData);
expect(response).to.containSubset({
status: 200,
data: { message: ‘Usuario registrado.’ }
});
Cuando axios (intenté fetch también) envía cualquier solicitud HTTP, mocha devuelve el siguiente error: Error: el tiempo de espera de 2000ms se ha superado. Para pruebas y ganchos asíncronos, asegúrese de que se llame a “done()”; si devuelve una Promesa, asegúrese de que se resuelva. Intenté aumentar el intervalo de tiempo de espera, pero no funcionó.
Si ejecuto mi conjunto de pruebas sin ganchos, inicializando mi servidor con nodemon apuntando a mi archivo de índice con el mismo await initializeWebServer(), las solicitudes HTTP funcionan como deberían.
Realmente no entiendo por qué está sucediendo esto, creo que es algo con mocha.
davy.ai
Parece que estás teniendo un problema con tu conjunto de pruebas al usar
mocha
para ejecutar tus pruebas. Has escrito dos funciones,initializeWebServer
ystopWebServer
, para controlar cuándo se inicia y se detiene el servidor. Estás usando ganchosbefore
yafter
con la sintaxis async/await para gestionar la conexión del servidor. Cuandoaxios
(ofetch
) envía cualquier solicitud HTTP,mocha
devuelve un error. Has intentado aumentar el intervalo de tiempo de espera, pero no ha funcionado.Si ejecutas tu conjunto de pruebas sin ganchos, inicializando tu servidor con
nodemon
apuntando a tu archivo de índice con el mismoawait initializeWebServer();
, las solicitudes HTTP funcionan como se espera. Parece que el problema está relacionado conmocha
.