Home > Software design >  Mocha Chai NodeJS never fails while it should
Mocha Chai NodeJS never fails while it should

Time:10-29

Hello I just try to do some functional test with mocha chai on nodeJS api and everytime I try something even if it's not what expected from test, the test seems to pass.

Here is my test code :

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);
            })
        })
    })
})

and this is what I get :

> 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.
200

since I wait 400 and get 200 it should fail but it isn't.

CodePudding user response:

The problem is that you are testing a promise so your test is finished before the promise resolves (with either success or error). In order to make mocha wait for the promise you can do one of the following:

  1. Return the promise from the mocha 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);
            })
        })
    })
})
  1. use async function and await the promise, then perform the expecations:
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);
        })
    })
})

Here you can omit the catch clause since mocha will figure it out.

You can read more about testing async stuff in the official mocha docs.

  • Related