Mocha + Chai + NodeJS 永远不会失败

Mocha + Chai + NodeJS never fails while it should

你好,我只是尝试在 nodeJS 上用 mocha + chai 做一些功能测试 api 每次我尝试一些东西,即使它不是测试所期望的,测试似乎通过了。

这是我的测试代码:

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

这就是我得到的:

> 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

因为我等待 400 并得到 200,它应该会失败,但事实并非如此。

问题是您正在测试一个承诺,因此您的测试在承诺解决(成功或错误)之前完成。为了使 mocha 等待 promise,您可以执行以下操作之一:

  1. Return mocha it 街区的承诺
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. 使用异步函数和await承诺,然后执行期望:
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);
        })
    })
})

这里你可以省略 catch 子句,因为 mocha 会解决它。

您可以在 official mocha docs 中阅读有关测试异步内容的更多信息。