为什么我的异步Jest测试在应该失败的时候没有失败
Why is my async Jest test not failing when it should?
我有一些异步操作需要用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
。
相关文章:
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- iPad没有加载所有HTML5元素
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- 一台特定计算机的Ajax请求数据未定义/失败
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- jQuery.getJSON失败,语法错误
- ng disabled在放入多个表达式时失败
- Jasmine单元测试在监视服务方法时失败
- jQuery分页下一页和上一页按钮在点击零或超过最后一页后失败
- 在iframe的情况下,jQuery html()将失败
- 在我的情况下,使用带有变量失败的 jquery 选择器
- 带有CSS的数据属性就没那么有用了
- CSS中的转换似乎失败了,原因是什么
- moment.js作为AMD模块加载时静默失败.其他模块都没问题