javascript - 期待一个 Jest 测试来解决,但不关心值(value)

标签 javascript testing promise jestjs

假设我有以下要测试的 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 提示并且测试失败。

awaitexpect()之前时,foo()返回一个Promiseexpect() 将其包装到一个对象中,该对象的 .resolves.toBe...() 返回另一个 Promiseawait等待它。

一般规则是:如果将 await 放在对 expect() 的调用中,则不能使用 .resolves .rejects 因为 expect() 收到的值不是 Promise。 为了使用.resolves.rejectsawait 关键字应该放在expect() 前面称呼。 或者,您可以return Promise 而不是 await -ing。

阅读更多关于 .resolves and .rejects 的信息.

旧答案

如果您知道 foo() 总是解析为一个值,那么您可以使用 .toBeDefined():

it('resolves', async () => {
  await expect(foo()).resolves.toBeDefined();
});

如果 foo() 使用 return undefinedreturn (没有值)完成,或者它不使用,这将不起作用返回

在这种情况下,您不能使用 .resolves,但您可以简单地返回 foo() 返回的 Promise,Jest 会处理休息:

it('resolves', () => {
  return foo();
});

关于javascript - 期待一个 Jest 测试来解决,但不关心值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54525147/

相关文章:

javascript - 意外的 token 导出异步函数

java - 对于没有名称的弹出窗口,弹出窗口名称为 ="window"的 waitForPopUp 方法的奇怪行为?

c# - 如何针对不受我控制的服务进行测试?

javascript - 未处理的 promise 拒绝 AVA

javascript - IE8 knockout 3.3.0错误

Javascript 类属性始终未定义

javascript - 在 RxJS 6 中重置 ReplaySubject

php - 在 PHPUnit 测试执行期间隐藏输出

javascript - function.apply.bind 在以下代码中如何工作?

javascript - DOJO Promise All 子函数