Mar*_*ahn 8 javascript testing promise jestjs
假设我有以下要测试的 fn:
const foo = async () => {}
Run Code Online (Sandbox Code Playgroud)
这当然可以解决,但我如何用 Jest 测试它?
it('resolves', async () => {
expect(await foo()).???
});
Run Code Online (Sandbox Code Playgroud)
我能找到的所有示例都需要值,例如 expect(await foo()).resolves.toBe(42)
axi*_*iac 13
如果您知道它foo()
总是解析为一个值,那么您可以使用.toBeDefined()
:
it('resolves', async () => {
await expect(foo()).resolves.toBeDefined();
});
Run Code Online (Sandbox Code Playgroud)
如果foo()
完成使用return undefined
或return
(没有值)或根本不使用return
,这将不起作用。
在这种情况下,您不能使用,.resolves
但您可以简单地返回Promise
返回的 byfoo()
并且 Jest 负责其余的工作:
it('resolves', () => {
return foo();
});
Run Code Online (Sandbox Code Playgroud)
属性.resolves
用创建的期望对象的expect()
是也具有相同的特性(匹配器)作为常规的期望对象的期望对象。唯一的区别是它期望实际值是 aPromise
并且匹配器应用于解析的值,而不是承诺。
如果函数返回的 promise 解决了,则意味着它不会抛出(如果抛出则被拒绝,未解决)。
让我们用 Jest 代码表达这个期望:
it('resolves', async () => {
await expect(foo()).resolves.toBeDefined();
});
Run Code Online (Sandbox Code Playgroud)
您已经尝试过:
expect(await foo()).resolves.toBe(42)
Run Code Online (Sandbox Code Playgroud)
它不能以这种方式工作,因为结果await foo()
不是 aPromise
而是Promise
返回的已解析值foo()
(假设它已解析)。
.resolves.toBe()
期望 a Promise
,Jest 抱怨并且测试失败。
Whenawait
在 之前expect()
,foo()
返回 a Promise
,expect()
将其包装成一个对象,该对象.resolves.toBe...()
返回另一个Promise
并await
等待它。
一般规则是:如果你把await
调用放在里面,expect()
那么你不能使用.resolves
或者.rejects
因为expect()
接收的值不是Promise
. 为了使用.resolves
or .rejects
,await
关键字应该留在expect()
调用的前面。或者,您可以return
使用Promise
代替await
-ing 来代替它。
阅读更多关于.resolves
和.rejects
。
归档时间: |
|
查看次数: |
3586 次 |
最近记录: |