首页 > 解决方案 > Mocha + Chai + NodeJS 永远不会失败,而它应该

问题描述

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

这是我的测试代码:

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 它应该会失败,但事实并非如此。

标签: javascriptnode.jstestingmocha.jschai

解决方案


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

  1. 从 mochait块返回承诺
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 会弄清楚。

您可以在mocha 官方文档中阅读有关测试异步内容的更多信息。


推荐阅读