【发布时间】:2020-12-27 18:28:24
【问题描述】:
我正在使用 mocha 和 supertest 在 Node 中编写集成测试,并且必须在数据库中创建用户。我的问题是,有时用户会在测试完成后得到保存。 这是我的用户创建函数:
async function createUser() {
const userParam = {
username: "User",
password: "123456789",
firstName: "Max",
lastName: "Mustermann",
role: JSON.stringify(Role.User),
};
const user = new User(userParam);
user.hash = bcrypt.hashSync(userParam.password, 10);
await user.save();
console.log("User saved!");
}
这是测试:
it("respond with 403 forbidden, because a standard user cant delete other users", function (done) {
createUser().then(
login(userLoginData).then((responseBody) => {
request(app)
.delete("/users/0000000000006204aefc242c")
.set(
"Authorization",
`Bearer ${responseBody.body.accessToken}`,
)
.expect(
403,
{
Error: "Forbidden",
message:
"Forbidden for your rank, if its not your own account.",
},
done,
);
}),
);
});
这是我从 mocha 得到的输出:
DELETE /
Successes
Admin saved!
User saved!
✓ respond with 200 ok, because admins are allowed to delete all users (431ms)
User saved!
✓ respond with 200 ok, because he is allowed to delete himself (195ms)
Errors
1) respond with 403 forbidden, because a standard user cant delete other users
User saved!
前两个测试正在完成,因为所需的帐户是在测试之前创建的,但最后一个测试(如上所示)失败。
这里是当前 github 分支中文件的链接: https://github.com/Knniff/loginbackend/blob/2fa/test/tests.js
我很高兴收到所有反馈,如果您有更好的方法来做这些准备工作,我想听听。
【问题讨论】:
-
then不会过早触发回调 - 你没有传递回调函数! -
所以我应该对 .save 使用 return 而不是 await 吗?
-
不,这完全没问题,您的
createUser函数有效。不起作用的是测试中的.then(login(userLoginData).then(…)),其中login调用应该放在函数表达式中。
标签: javascript node.js asynchronous mocha.js