假设我有以下要测试的 fn:
const foo = async () => {}
这当然可以解决,但是我该如何用 Jest 测试它呢?
it('resolves', async () => {
expect(await foo()).???
});
我能找到的所有示例都需要值,例如期待(等待 foo()).resolves.toBe(42)
最佳答案
更新,比我聪明两年
由 expect()
创建的期望对象的属性 .resolves
也是一个期望对象,它具有与常规期望对象相同的属性(匹配器)。唯一的区别是它期望实际值是一个 Promise
并且匹配器应用于已解析的值,而不是 promise。
如果函数返回的 promise resolve 意味着它没有抛出(如果抛出则被拒绝,没有被解析)。
让我们在 Jest 代码中表达这种期望:
it('resolves', async () => {
await expect(foo()).resolves.not.toThrow();
});
你的代码有什么问题
你已经尝试过:
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
-ing。
阅读更多关于 .resolves
and .rejects
的信息.
旧答案
如果您知道 foo()
总是解析为一个值,那么您可以使用 .toBeDefined()
:
it('resolves', async () => {
await expect(foo()).resolves.toBeDefined();
});
如果 foo()
使用 return undefined
或 return
(没有值)完成,或者它不使用,这将不起作用返回
。
在这种情况下,您不能使用 .resolves
,但您可以简单地返回 foo()
返回的 Promise
,Jest 会处理休息:
it('resolves', () => {
return foo();
});
关于javascript - 期待一个 Jest 测试来解决,但不关心值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54525147/