我有一些异步操作需要用Jest进行测试。我的测试本应失败,但现在却通过了。
describe('Asynchronous Code', () => {
it('should execute promise', () => {
console.log(1);
someFunctionThatReturnsAPromise()
.then(() => {
console.log(2);
expect(true).toBeFalsy();
console.log(3);
});
console.log(4);
});
});
当我运行npm test
时,我得到以下输出:
PASS __tests__/Async.test.js
● Console
console.log __tests__/Async.test.js:3
1
console.log static-content-test/react/actions/DashboardActions.test.js:6
2
console.log static-content-test/react/actions/DashboardActions.test.js:10
4
正如您所看到的,测试正在通过,但console.log(3)
从未被执行,因为true
不是falsy,并且期望失败。
如何让Jest在异步回调中识别我的期望?
return someFunctionThatReturnsAPromise()
.then(() => {
expect(true).toBeFalsy();
});
这样,测试就如预期的那样失败了:
FAIL __tests__/Async.test.js
● Asynchronous Code › should execute promise
expect(received).toBeFalsy()
Expected value to be falsy, instead received
true
这是facebook使用jest测试异步代码的模式。
或者,您可以按照这里描述的done
模式:
it('should execute promise', (done) => {
someFunctionThatReturnsAPromise()
.then(() => {
expect(true).toBeFalsy();
done();
});
});
这将适用于Jest,但更常用于Jasmine和Mocha。
这是另一种解决方案。
一旦到达上下文末尾,Jest将被终止。因此,您需要从回调返回promise,告诉它等待promise得到解决和测试。
假设有一个承诺
const promise=fetch("blah.com/api")
test("should return valid data",()=>{
return expect(promise).resolves.toBeTruthy()
})
.resolves
等待promise
解析,然后应用适当的matchers
如您所愿。
在检查错误情况时,也可以使用.rejects
。