如何解决如何用 Chai 测试错误?
我正在测试获取用户的 api 路由。它运作良好。现在,我想测试如果我获取一个不存在的用户,该路由是否会引发错误并显示正确的消息。测试声称是肯定的,但我知道这不是因为我无法 console.log 结果或 .end()
回调中的错误。这是测试和路线:
require("dotenv").config();
import chai from "chai";
import chaiHttp from "chai-http";
import connectToDatabase from "../database/connection";
import { app } from "../index";
import jwt from "jsonwebtoken";
chai.use(chaiHttp);
const api = chai.request(app);
before((done) => {
connectToDatabase().then(() => done());
});
const token = jwt.sign(
{ _id: "123",locale: "en" },process.env.JWT_TOKEN_KEY,{
expiresIn: "14d",}
);
describe("GET /user/:id",() => {
it("return user information",() => {
api
.get("/user/607183db2020190b510bd9a5")
.set("Cookie",`mycookie=${token};`)
.end((err,res) => {
chai.expect(res).to.have.status(200);
chai.expect(res.body.user._id).to.equal("607183db2020190b510bd9a5");
});
});
it("throws an error if the user doesn't exist",() => {
api
.get("/user/abc")
.set("Cookie",res) => {
console.log("res Failed ok",res,"eeror",err); // this line never shows up
chai.expect(err).to.throw("error.unkNown");
});
});
});
// the route:
const getUser = async (
req: GetUser,res: IResponse
): Promise<IResponse> => {
try {
const user = await UserControler.findUserById(req.params.id);
return res.status(200).json({ user });
} catch (err) {
throw new Error("error.unkNown");
}
};
export default getUser;
如何解决这个问题?
解决方法
如此处所述(警告部分)https://www.chaijs.com/plugins/chai-http/,您在使用 end() 函数时需要使用 done。
因为 end 函数传递了一个回调,所以运行断言 异步。因此,必须使用一种机制来通知 回调已完成的测试框架。否则, 测试将在检查断言之前通过。
这会导致您的测试一直等到 done() 被调用。 end() 函数在您的请求完成后运行。传递 done 参数使 mocha 等待直到 done() 被调用或超时。如果您不使用它,则无需等待响应即可测试成功。
所以你应该在你的测试中这样做(注意第一个测试中的变化):
describe("GET /user/:id",() => {
it("return user information",(done) => {
api
.get("/user/607183db2020190b510bd9a5")
.set("Cookie",`mycookie=${token};`)
.end((err,res) => {
chai.expect(res).to.have.status(200);
chai.expect(res.body.user._id).to.equal("607183db2020190b510bd9a5");
done(); // here
});
});
it("throws an error if the user doesn't exist",(done) => {
api
.get("/user/abc")
.set("Cookie",res) => {
console.log("res failed ok",res,"eeror",err); // this line never shows up
chai.expect(err).to.throw("error.unknown");
done(); // and here
});
});
});
对测试函数使用箭头函数也不是最佳实践。改用 function(){。检查这个的原因 https://mochajs.org/#arrow-functions
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。