【问题标题】:Why is my sinon test timing out instead of failing?为什么我的 sinon 测试超时而不是失败?
【发布时间】:2019-04-19 12:00:15
【问题描述】:

下面是测试代码:

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 毫秒的超时。对于异步测试和钩子,确保 “完成()”被调用;如果返回一个 Promise,请确保它解析。

我猜 promise 没有解决,因为 expect 失败了。所以它没有达到done()。有没有办法让我更干净地重写它?还是使用 try/catch 编写此测试的适当方式?

我阅读了several SO answers 的类似问题,他们说要确保被测代码不会吞下错误。但在我的代码中,我没有看到任何吞下错误的代码。

【问题讨论】:

    标签: typescript async-await sinon


    【解决方案1】:

    我通过等待被测代码而不是使用回调/完成结构来简化它,并使用参数期望(称为With)而不是在假回调中执行期望。

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

      it.only('returns a valid response', async () => {
        const publish = sinon.stub();
    
        await router(publish);
        expect(publish).to.be.calledWith('wrong');
    
        sinon.restore();
      });
    

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      相关资源
      最近更新 更多