Почему мой тест Sinon истекает, а не проваливается? - PullRequest
0 голосов
/ 19 апреля 2019

Вот тестируемый код:

function timeout(): Promise<NodeJS.Timeout> {
  return new Promise(resolve => setTimeout(resolve, 0));
}

async function router(publish: Publish): Promise<void> => {
  await timeout();
  publish('requestObject');
};

Вот мой тест. Если я воспользуюсь попыткой / уловкой ниже, она сразу же завершится с ошибкой.

it.only('returns a valid response', (done) => {
    const publish = sinon.stub();

    publish.callsFake((publishResponse) => {
      try {
        expect(publishResponse).to.equal('wrong');
        done();
      } catch (error) {
        done(error);
      }
    });

    router(publish);

    sinon.restore();
});

Если я удаляю время проверки / перехвата теста с:

publish.callsFake((publishResponse) => {
  expect(publishResponse).to.equal('wrong');
  done();
});

Ошибка: превышено время ожидания 5000 мс. Для асинхронных тестов и хуков, убедитесь, что "done ()" называется; если вы возвращаете обещание, убедитесь, что оно разрешено.

Полагаю, обещание не разрешается, потому что ожидание не выполняется. И поэтому он не попадает в готово (). Есть ли способ для меня, чтобы переписать это более аккуратно? Или используете try / catch для написания этого теста?

Я прочитал несколько ответов SO с похожим вопросом, и они говорят, чтобы проверяемый код не глотал ошибки. Но в моем коде я не вижу кода, поглощающего ошибку.

1 Ответ

0 голосов
/ 19 апреля 2019

Я упростил его, ожидая тестируемый код вместо использования структуры callback / done и используя ожидание аргумента (namedWith) вместо выполнения ожидания внутри поддельного обратного вызова.

Я недействительно уверен, почему это работает вместо метода обратного вызова.

  it.only('returns a valid response', async () => {
    const publish = sinon.stub();

    await router(publish);
    expect(publish).to.be.calledWith('wrong');

    sinon.restore();
  });
...