簡體   English   中英

.then 在承諾解決之前觸發

[英].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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM