确保已在Jest中等待函数的方法

时间:2019-09-26 10:49:36

标签: async-await jestjs

我有一个类似的功能(简化了代码以使此代码更具可读性)

import Adapter from "adapter-package";

const adapter = new Adapter();

async powerOn(): Promise<MyClass> {
  const myClass = new MyClass();
  await adapter.powerOn();
  return myClass;
}

如您所见,我在await的通话中使用adapter.powerOn()。现在,我正在使用Jest编写单元测试。

it("can power on the adapter", async () => {
  const spy = jest.spyOn(Adapter.prototype, "powerOn");
  const myClass = await MyClass.powerOn();
  expect(myClass).toBeInstanceOf(MyClass);
  expect(spy).toHaveBeenAwaitedFor();
              ^^^^^^^^^^^^^^^^^^^^
  spy.mockRestore();
}, 10000);

我强调的测试不存在,但这是我要测试的。我可以知道是否已经等待调用的方法吗?

编辑:

詹金斯会指出我不清楚我在问什么。基本上,我想确保在解决函数时,adapter.powerOn()返回的Promise也已解决。因为我已经遇到一个问题,我不小心删除了await之前的adapter.powerOn()

async powerOn():承诺{   const myClass = new MyClass();   adapter.powerOn();   返回myClass; }

所以当我用

调用函数时
await powerOn();

该函数已解决,但它没有等待对adapter.powerOn()的调用,因此我不得不花一些时间进行调试。因此,我想确保在adapter.powerOn()完成时解决await powerOn()

3 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

it("can power on the adapter", async () => {
  let hasResolved = false;
  const spy = jest.spyOn(Adapter.prototype, "powerOn");

  const myClass = await MyClass.powerOn();
  expect(myClass).toBeInstanceOf(MyClass);

  let hasResolved = false;
  //if it has been awaited then this should complete
  spy.returnValues[0].then(()=>{
      hasResolved=true;
  })
  expect(hasResolved).to.be.true;
  spy.mockRestore();
}, 10000)

答案 1 :(得分:0)

您可以使用setInmediate等待所有未完成的承诺:

const flushPromises = () => new Promise(setImmediate);

it("can power on the adapter", async () => {
  const spy = jest.spyOn(Adapter.prototype, "powerOn");
  await expect(MyClass.powerOn()).resolves.toBeInstanceOf(MyClass);
  await expect(flushPromises()).resolves.toBeTruthy();
}, 10000);

此测试首先检查powerOn是否解析并返回MyClass的实例,然后检查每个待处理的承诺是否已解决或拒绝。

答案 2 :(得分:0)

这是我找到的解决方案:

import { inspect } from "util";

it("waits for the adapter to have been powered on", async () => {
  const spy = jest
    .spyOn(Adapter.prototype, "powerOn")
    .mockImplementation(() => new Promise<void>(res => setTimeout(res, 0)));
  await Sblendid.powerOn();
  const spyPromise = spy.mock.results[0].value;
  expect(inspect(spyPromise)).toBe("Promise { undefined }");
}, 10000);

线

spy.mock.results[0].value

将使我得到模拟所返回的承诺。在承诺上使用util.inspect

expect(inspect(spyPromise)).toBe("Promise { undefined }");

会给我"Promise { undefined }"兑现已兑现的承诺(即返回undefined),如果未兑现,则会返回"Promise { <pending> }",这就是我测试已解决的方式(完成)await Sblendid.powerOn();