我有一个具有异步代码和多个回调的函数
var f = (cb1, cb2) => {
return new Promise((resolve, reject) => { /* ... */ });
};
在我的测试中,我用sinon创建了tu spy
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(); }
);
});
它有效,但感觉不对。 有关这种测试的最佳实践吗?
答案 0 :(得分:1)
Mocha中的done
回调专门用于测试异步代码,而不是直接控制成功或失败的方法。
应该抛出导致测试失败的主要方法错误对象,理想情况下会显示指示失败原因的消息。 断言是在未满足某些特定条件时会抛出此类错误的语句。这里有很多图书馆,据我所知,其中chai是最受欢迎的。
Sinon本身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;
});
});