如何使用sinon在mocha中测试多个回调?

时间:2018-05-29 09:17:26

标签: javascript node.js unit-testing mocha

我有一个具有异步代码和多个回调的函数

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

它有效,但感觉不对。 有关这种测试的最佳实践吗?

1 个答案:

答案 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;
    });
});
相关问题