Hola, solo trato de hacer una prueba funcional con mocha + chai en nodeJS api y cada vez que intento algo, incluso si no es lo que esperaba de la prueba, la prueba parece pasar.
Aquí está mi código de prueba:
const server = require("../server"); const chai = require("chai"); const chaiHttp = require("chai-http"); chai.use(chaiHttp); const expect = require("chai").expect; const requester = chai.request(server); describe("test user", function(){ describe("get all", function(){ it("should return all users and 400", function(){ requester.get("/api/users") .then(function(res){ console.log(res.status); expect(res).to.have.status(400); }) .catch(function(err){ throw(err); }) }) }) })y esto es lo que obtengo:
> backend@1.0.0 test > mocha "tests/users.test.js" App listening at http://:::4000 test user get all ✔ should return all users and 400 1 passing (13ms) Successfully connected to MongoDB. 200como espero 400 y obtengo 200, debería fallar, pero no lo es.
El problema es que está probando una promesa, por lo que su prueba finaliza antes de que se resuelva la promesa (con éxito o error). Para hacer que Mocha espere la promesa, puede hacer una de las siguientes cosas:
it block describe("test user", function(){ describe("get all", function(){ it("should return all users and 400", function(){ return requester.get("/api/users") .catch(function(res){ expect(res).to.have.status(400); }) }) }) })await la promesa, luego realice las expectativas: describe("test user", function(){ describe("get all", function(){ it("should return all users and 400", async function(){ const res = await requester.get("/api/users") expect(res).to.have.status(400); }) }) }) Aquí puede omitir la cláusula de catch ya que mocha lo resolverá.
Puede leer más sobre cómo probar cosas asincrónicas en los documentos oficiales de mocha .