假设我要测试以下fn:
const foo = async () => {}
这当然可以解决,但是如何使用Jest进行测试?
it('resolves', async () => {
expect(await foo()).???
});
我可以找到的所有示例都需要值,例如expect(await foo()).resolves.toBe(42)
答案 0 :(得分:3)
如果您知道foo()
始终解析为一个值,则可以使用.toBeDefined()
:
it('resolves', async () => {
await expect(foo()).resolves.toBeDefined();
});
如果foo()
使用return undefined
或return
(没有值)完成,或者根本不使用return
,则此方法不起作用。
在这种情况下,您不能使用.resolves
,而可以简单地返回Promise
返回的foo()
,而Jest负责其余的工作:
it('resolves', () => {
return foo();
});
您尝试过:
expect(await foo()).resolves.toBe(42)
这种方式不起作用,因为await foo()
的结果不是Promise
,而是Promise
返回的foo()
的解析值(假设它解析了) 。
.resolves.toBe()
期望Promise
,Jest抱怨并且测试失败。
当await
在expect()
前面时,foo()
返回一个Promise
,expect()
将其包装到一个对象中,该对象的.resolves.toBe...()
返回另一个Promise
和await
正在等待。
一般规则是:如果将await
放在对expect()
的调用中,则不能使用.resolves
或.rejects
,因为expect()
会收到值不是Promise
。
为了使用.resolves
或.rejects
,await
关键字应留在expect()
调用的前面。
另外,您也可以return
Promise
代替await
。
答案 1 :(得分:0)
我不认为玩笑本能地支持这一点。但是,jest-extended库(由社区管理的扩展名)使用#toResolve()
await expect(foo()).toResolve()
开玩笑的开发者discuss the request here,并请我们转到jest-extended
答案 2 :(得分:0)
你也可以在这里不使用 expect :
it('resolves', async () => {
await foo();
});
如果 foo 抛出,它无论如何都会使测试失败。失败时的输出略有不同,但也非常易读和易懂。
我更喜欢这种方式,因为它简短而清晰。