[英].then triggering before promise resolved
我正在使用 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
我很高興收到所有反饋,如果您有更好的方法來做這些准備工作,我很想聽聽。
測試的第 2 行有問題。 在createUser()
函數之后,您不會等待 promise 立即解析並調用login()
createUser()
函數。 您應該將login()
函數調用包裝到箭頭函數() => login(userLoginData)
。 您可以對測試進行以下更改:
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,
);
});
});
編輯:
另外,我建議在您的測試中使用 async/await:
it("respond with 403 forbidden, because a standard user cant delete other users", async function () {
await createUser();
const responseBody = await login(userLoginData);
await 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."
}
);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.