如何使sinon模拟在不同的调用上返回不同的对象?

时间:2019-02-26 00:05:28

标签: node.js unit-testing mocking sinon spy

 mock = sinon.mock();
 mock.exactly(2);
 mock.callsArgWith(1, m1);
 mock.callsArgWith(1, m2);

在我的测试中,m2覆盖了m1。我想在第一个电话中返回m1,在第二个电话中返回m2。

该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以使用onCall(n)(或别名onFirstCallonSecondCallonThirdCall)来定义 nth 调用的行为:

import * as sinon from 'sinon';

test('mock returns different objects on different calls', () => {
  const m1 = { id: 1 }
  const m2 = { id: 2 }

  const mock = sinon.mock();
  mock.exactly(2);
  mock
    .onFirstCall().callsArgWith(1, m1)    // first call calls its second arg with m1
    .onSecondCall().callsArgWith(1, m2);  // second call calls its second arg with m2

  const spy = sinon.spy();
  mock('arg0', spy);  // spy should be called with m1
  mock('arg0', spy);  // spy should be called with m2

  sinon.assert.calledWithExactly(spy.getCall(0), m1);  // SUCCESS
  sinon.assert.calledWithExactly(spy.getCall(1), m2);  // SUCCESS
  mock.verify();  // SUCCESS
});