这是正在测试的代码:
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时也遇到类似的问题,他们说是为了确保被测代码不会误入错误。但是在我的代码中,我看不到任何代码吞噬该错误。
答案 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();
});