javascript - 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 它应该会失败,但事实并非如此。
解决方案
问题是您正在测试一个承诺,因此您的测试在承诺解决之前完成(成功或错误)。为了让 mocha 等待承诺,您可以执行以下操作之一:
- 从 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);
})
})
})
})
- 使用异步函数和
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 官方文档中阅读有关测试异步内容的更多信息。
推荐阅读
- flutter - 从头开始重建子小部件,包括颤振中的状态
- django - 类型 inet 的输入语法无效
- sql-server - 一种跨多行强制唯一性的方法,或者重新设计这样就没有必要了?
- tcl - 如何在 tcl 中查看字典(键)中的项目?
- c++ - 嵌套状态机 C++
- javascript - 样式recaptcha包装div
- python - 附加到列表列表
- angular - 在Angular 9中更改路线时防止图像重新加载
- java - JAVA正则表达式包含字母中间带点的单词并包含带点的特殊单词
- reactjs - 如何使用 React Navigation V5 在我的抽屉中添加注销按钮