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. 为了使用.resolvesor .rejects,await关键字应该留在expect()调用的前面。或者,您可以return使用Promise代替await-ing 来代替它。
阅读更多关于.resolves和.rejects。
| 归档时间: |
|
| 查看次数: |
3586 次 |
| 最近记录: |