我需要使用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
不是假的,期望失败。
如何让Jest在异步回调中识别我的期望?
答案 0 :(得分:8)
在测试异步代码时,您需要从测试中返回promise。将测试体更改为:
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
This is the pattern facebook uses for testing async code with jest.
答案 1 :(得分:2)
或者,您可以按照done
模式as described here:
it('should execute promise', (done) => {
someFunctionThatReturnsAPromise()
.then(() => {
expect(true).toBeFalsy();
done();
});
});
这适用于Jest,但更常用于Jasmine和Mocha。
答案 2 :(得分:0)
这是替代解决方案。
玩笑将在到达上下文结尾时终止。因此,您需要从回调中返回承诺,以使其等待承诺得到解决和测试。
我们说有希望
const promise=fetch("blah.com/api")
test("should return valid data",()=>{
return expect(promise).resolves.toBeTruthy()
})
.resolves
等待promise
解析,然后您应用适当的方法
matchers
如您所愿。
在检查错误情况时,也可以使用.rejects
。