我有一个带有异步代码和多个回调的函数
var f = (cb1, cb2) => {
return new Promise((resolve, reject) => { /* ... */ });
};
在我的测试中,我用 sinon 创建了 tupies
var cb1Spy = sinon.spy();
var cb2Spy = sinon.spy();
为了测试它们是否都被称为我有一个测试
it('test', (done) => {
var cbCount = 2;
var checkIfDone = () => {
if(--cbCount === 0){
done()
}
};
f(
() => { cb1Spy; checkIfDone(); },
() => { cb2Spy; checkIfDone(); }
);
});
它可以工作,但感觉不对。 有关于这种测试的最佳实践吗?
最佳答案
Mocha 中的 done
回调专门用于测试异步代码,并不是直接控制成功或失败的方法。
导致测试失败的主要方法应该是抛出 Error 对象,最好带有指示失败原因的消息。 断言是如果不满足某些特定条件就会抛出此类错误的语句。有很多库可以实现此目的,其中 chai据我所知是最受欢迎的。
诗农本身comes with some assertions与其测试替身一起使用。例如,如果您想断言 cb1Spy
被调用一次,您可以这样写:
sinon.assert.calledOnce(cb1Spy);
如果您最终使用 chai,有一个不错的插件,名为 sinon-chai您可以使用它使 sinon 断言看起来更类似于 chai 的断言,从而为您的测试提供更一致的语法。如果您使用它,您可以像这样编写测试:
const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const { expect } = chai;
chai.use(sinonChai);
describe('whatever', function() {
it('test', function() {
let cb1Spy = sinon.spy();
let cb2Spy = sinon.spy();
f(cb1Spy, cb2spy);
expect(cb1Spy).to.have.been.calledOnce;
expect(cb2Spy).to.have.been.calledOnce;
});
});
关于javascript - 如何使用 sinon 测试 mocha 中的多个回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580634/