期待一个笑话测试来解决,但不关心价值

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 undefinedreturn(没有值)或根本不使用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 Promiseexpect()将其包装成一个对象,该对象.resolves.toBe...()返回另一个Promiseawait等待它。

一般规则是:如果你把await调用放在里面,expect()那么你不能使用.resolves或者.rejects因为expect()接收的值不是Promise. 为了使用.resolvesor .rejectsawait关键字应该留在expect()调用的前面。或者,您可以return使用Promise代替await-ing 来代替它。

阅读更多关于.resolves.rejects