为什么我的sinon测试会超时而不是失败?

时间:2019-04-19 12:00:16

标签: typescript async-await sinon

这是正在测试的代码:

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

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

这是我的考试。如果我在下面使用try / catch,它会立即失败,并显示正确的错误。

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

如果我删除了try / catch,则测试超时:

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

错误:超时超过5000毫秒。对于异步测试和挂钩,请确保   称为“ done()”;如果返回了Promise,请确保它可以解决。

我猜因为期望失败了,所以诺言没有兑现。因此,它没有达到done()。我有办法更干净地重写它吗?还是使用try / catch是编写此测试的适当方法?

我读过several SO answers时也遇到类似的问题,他们说是为了确保被测代码不会误入错误。但是在我的代码中,我看不到任何代码吞噬该错误。

1 个答案:

答案 0 :(得分:0)

我通过等待被测代码而不是使用callback / done结构,并使用参数期望值(With)而不是在伪回调中进行期望值来简化了此过程。

我不太确定为什么它能代替回调方法起作用。

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

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

    sinon.restore();
  });