期望可以通过开玩笑的​​测试来解决,但不关心其价值

时间:2019-02-04 22:16:43

标签: javascript testing promise jestjs

假设我要测试以下fn:

const foo = async () => {}

这当然可以解决,但是如何使用Jest进行测试?

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

我可以找到的所有示例都需要值,例如expect(await foo()).resolves.toBe(42)

3 个答案:

答案 0 :(得分:3)

如果您知道foo()始终解析为一个值,则可以使用.toBeDefined()

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

如果foo()使用return undefinedreturn(没有值)完成,或者根本不使用return,则此方法不起作用。

在这种情况下,您不能使用.resolves,而可以简单地返回Promise返回的foo(),而Jest负责其余的工作:

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

您的代码有什么问题

您尝试过:

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

详细了解.resolves and .rejects

答案 1 :(得分:0)

我不认为玩笑本能地支持这一点。但是,jest-extended库(由社区管理的扩展名)使用#toResolve()

await expect(foo()).toResolve()

开玩笑的开发者discuss the request here,并请我们转到jest-extended

答案 2 :(得分:0)

你也可以在这里不使用 expect :

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

如果 foo 抛出,它无论如何都会使测试失败。失败时的输出略有不同,但也非常易读和易懂。

我更喜欢这种方式,因为它简短而清晰。