在下面的代码中,在测试中的承诺被解决之前,在{em>之前被称为afterEach()
,并且被称为done()
。我希望它在使用done()
完成测试之后才能运行。正确的方法是什么?
describe ("Some test", ()=>{
afterEach(()=>{
console.log("Done")
})
it("Does something", done=>{
new Promise (resolve=>{
let result = doSomething();
assert.isOK(result);
done();
})
})
})
答案 0 :(得分:2)
那不是您在Mocha中使用Promises的方式。
Mocha仅通过返回Promise(不需要done()
)或通过使用async
函数作为测试(隐式返回Promise)来支持异步测试,如下所示:
describe ("Some test", ()=>{
afterEach(()=>{
console.log("Done")
})
it("Does something", async () => {
const result = await someAsyncFunction();
assert.isOK(result);
// no need to return from this one, async functions always return a Promise.
})
})
或
describe ("Some test", ()=>{
afterEach(()=>{
console.log("Done")
})
it("Does something", done=>{
// note the return
return new Promise (resolve=>{
doSomethingWithCallback(result => {
assert.isOK(result);
resolve(result);
});
})
})
})
请注意,在非低级代码中使用new Promise()
构造函数被视为反模式。有关更多详细信息,请参见此问题:What is the explicit promise construction antipattern and how do I avoid it?
答案 1 :(得分:0)
我猜下面的内容(在整个测试过程中都遵循诺言)可以满足我的要求,但是肯定有更好的方法。
let testPromiseChain = Promise.resolve();
describe("Some test", () => {
afterEach(() => {
testPromiseChain
.then(x=>{
console.log("Done")
})
})
it("Does something", done => {
testPromiseChain = testPromiseChain
.then(() => {
new Promise(resolve => {
let result = doSomething();
assert.isOK(result);
done();
})
})
})
})