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

Posted

技术标签:

【中文标题】Mocha Chai 基本 GET 请求未正确记录通过和失败【英文标题】:Mocha Chai basic GET request not recording passes and fails correctly 【发布时间】:2021-10-08 07:39:30 【问题描述】:

我对 mocha.js 还很陌生,所以尝试通过一个最小的示例来获得一些相当基本和可靠的东西。

我正在尝试向示例 JSON API 发出 GET 请求并在其上运行 3 个测试,所有测试都应该有不同的结果,但都得到了与预期不同的结果。

此外,我正在尝试捕获和计数/报告通过测试发生的错误以输出详细信息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()) 可能会按照您的预期工作。

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

const errors = [];

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

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

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

或者使用 async/await,它会隐式返回一个 Promise

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

  // Do assertions on result
  ...

  // No need to return anything here

【讨论】:

谢谢,好的答案。当前建议的方法是什么,在 Mocha 中显式使用 acync/await 或隐式使用 Promise? 我个人使用 async/await,IMO 更易读

以上是关于Mocha Chai 基本 GET 请求未正确记录通过和失败的主要内容,如果未能解决你的问题,请参考以下文章

使用Mocha / Chai和async / await验证是否抛出异常

使用 Mocha/Chai 测试复杂的 React 组件

Chai + mocha,解决则测试成功,拒绝则失败

有没有办法让 Chai 使用异步 Mocha 测试?

Chai-As-Promised 正在吃断言错误

单元/集成测试 Express REST API, mongoose, mocha, sinon, chai, supertest