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())
})
})
我发现提供的测试有两个问题
.finally(done())
立即成功完成测试,因为 .finally
期待回调并且 done
被调用, .finally(done)
或 .finally(() => done())
可能会按照您的预期工作。
通过 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
}
我是 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())
})
})
我发现提供的测试有两个问题
.finally(done())
立即成功完成测试,因为.finally
期待回调并且done
被调用,.finally(done)
或.finally(() => done())
可能会按照您的预期工作。通过 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
}