Mocha Chai 基本 GET 请求未正确记录通过和失败

Mocha Chai basic GET request not recording passes and fails correctly

我是 mocha.js 的新手,所以我试图通过一个最小的例子来获得一些相当基本和可靠的东西。

我正在尝试对示例 JSON API 和 运行 3 次测试发出 GET 请求,所有结果都应该有不同的结果,但结果都不同预期。

此外,我正在尝试捕获并 count/report 通过测试输出详细信息 after() 发生的错误 after() 所有测试都是 运行 以免弄乱 UI.

对于 3 项测试,我只有 1 项应该通过。问题是,如果我包含一个 .finally() 调用,那么它们都会通过,如果我删除 .finally() 调用并且只有 .catch() 调用,那么它们都会失败。不确定我错过了什么。

let errors = []

// After All output error details
after((done) => { 
  console.log("Total Errors: " + errors.length)
  // console.log(errors)
  done()
})


// Example Test Suite
describe("Example Test Suite", () => {

  it("#1 Should Pass on expect 200", (done) => {
    request("https://jsonplaceholder.typicode.com/")
      .get("todos/1")
      .expect(200)
      .catch(function (err) {
        errors.push(err)
        done(err)
      })
      .finally(done())
  })

  it("#2 Should Fail on wrong content type", (done) => {
    request("https://jsonplaceholder.typicode.com/")
      .get("todos/1")
      .expect("Content-Type", "FAIL")
      .catch(function (err) {
        errors.push(err)
        done(err)
      })
      .finally(done())
  })

  it("#3 Should Fail on contain.string()", (done) => {
    request("https://jsonplaceholder.typicode.com/")
      .get("todos/1")
      .then(function (err, res) {
        if (err) {done(err)} else {
          try {
            expect(res.text).to.contain.string("ThisShouldFail");
          } catch(e) {
            errors.push({error: e, response: res})
            done(err)
          } 
          finally {
            done()
          }
        }
      }).catch(function (err) {
        errors.push(err)
        done(err)
      })
      .finally(done())
  })
})

我发现提供的测试有两个问题

  1. .finally(done()) 立即成功完成测试,因为 .finally 期待回调并且 done 被调用, .finally(done).finally(() => done()) 可能会按照您的预期工作。

  2. 通过 try/catch 拦截错误是一种非常糟糕的做法,您的实现会在将测试标记为通过时吞下潜在的错误,即使它失败了,最好使用 mocha `s 测试上下文是一个 afterEach 钩子,例如:

const errors = [];

afterEach(function () {
    if (this.currentTest.state === "failed") {
        errors.push(this.currentTest.title)
    }
});

在 mocha 中使用 promise 时也不需要调用 done。可以简单地返回一个 promise,如果 promise 解决并且当 promise 解决时,mocha 将通过测试,否则失败(如果错误未被捕获)。

it("...", () => {
  return request(...).get(...).then(...)
}

或使用 async/await,其中 returns 隐式承诺

it("...", async () => {
  const result = await request(...).get(...)

  // Do assertions on result
  ...

  // No need to return anything here
}