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验证是否抛出异常
单元/集成测试 Express REST API, mongoose, mocha, sinon, chai, supertest