Tengo una aplicación que cuenta el número de visitas a la url. El conteo se realiza en Redis. Estoy usando redis-mock que simula comandos como INCR en la memoria.
La siguiente prueba visita la página 3 veces y espera que el objeto de respuesta informe current como 3 :
let app = require('./app'); const supertest = require("supertest"); jest.mock('redis', () => jest.requireActual('redis-mock')); /* Preceeded by the exact same test */ it('should report incremented value on multiple requests', (done) => { const COUNT = 3; const testRequest = function (cb) { supertest(app).get('/test').expect(200, cb) }; async.series([ testRequest, testRequest, testRequest ], (err, results) => { if (err) console.error(err); const lastResponse = _.last(results).body; expect( lastResponse.current ).toBe(COUNT); done(); }); }); El problema es que si sigo reutilizando la app , el simulacro interno "redis" seguirá aumentando entre las pruebas.
Puedo eludir esto un poco haciendo esto:
beforeEach(() => { app = require('./app'); jest.resetAllMocks(); jest.resetModules(); });La aplicación de sobrescritura parece funcionar, pero ¿no hay una manera de limpiar el módulo simulado "interno" de alguna manera entre las pruebas?
Mi suposición es que, de alguna manera, el punto final '/ prueba' se invoca en algunas otras pruebas en la suite, podría intentar ejecutar partes específicas de su suite usando .only o incluso intentar ejecutar la suite completa en serie .
Para responder a las preguntas originales, todo el conjunto debe estar aislado y ser coherente, ya sea si está ejecutando un escenario de caso de prueba específico o si está intentando ejecutar todo el conjunto, por lo tanto, debe eliminar cualquier resto que pueda afectar los resultados.
Por lo tanto, puede usar los métodos .beforeEach o .beforeAll , proporcionados por Jest para "simular" Redis y el método .afterAll para la autorización.
Una implementación ficticia se vería así:
import redis from "redis"; import redis_mock from "redis-mock"; import request from "supertest"; jest.mock("redis", () => jest.requireActual("redis-mock")); // Client to be used for manually resetting the mocked redis database const redisClient = redis.createClient(); // Sometimes order matters, since we want to setup the mock // and boot the app afterwards import app from "./app"; const COUNT = 3; const testRequest = () => supertest(app).get("/test"); describe("testing", () => { afterAll((done) => { // Reset the mock after the tests are done jest.clearAllMocks(); // You can also flush the mocked database here if neeeded and close the client redisClient.flushall(done); // Alternatively, you can also delete the key as redisClient.del("test", done); redisClient.quit(done); }); it("dummy test to run", () => { expect(true).toBe(true); }); it("the actual test", async () => { let last; // Run the requests in serial for (let i = 0; i < COUNT - 1; i++) { last = await testRequest(); } // assert the last one expect(last.status).toBe(200); expect(last.body.current).toBe(COUNT); }); });