Удостоверьтесь, что метод для функции ожидался в Jest - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть такая функция (код упрощен, чтобы сделать этот код более читабельным)

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);

Тест, который я подчеркнул, не существует, но я бы хотел его протестировать.Могу ли я узнать, ожидался ли вызванный мной метод?

edit:

Уилл Дженкинс указал, что не ясно, о чем я спрашиваю.По сути, я хочу убедиться, что Обещание, возвращаемое adapter.powerOn(), было разрешено к тому времени, когда была выполнена моя функция.Поскольку у меня уже была проблема, когда я случайно удалил await до adapter.powerOn().

async powerOn (): Promise {const myClass = new MyClass ();adapter.powerOn ();вернуть myClass;}

Поэтому, когда я вызывал свою функцию с помощью

await powerOn();

, эта функция была разрешена, но она не ожидала вызова adapter.powerOn(), и мне пришлось потратить некоторое время на отладку.Поэтому я хотел бы убедиться, что adapter.powerOn() разрешено к моменту завершения await powerOn().

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

Как насчет этого?

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)
0 голосов
/ 27 сентября 2019

Вот решение, которое я нашел:

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(); завершено.

0 голосов
/ 26 сентября 2019

Вы можете использовать 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, а затем проверяет, есть ли каждое ожидающее обещаниебыла решена или отклонена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...