如何让 sinon 在不同的调用中模拟 return 不同的对象?

How to make sinon mock return different objects on different calls?

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

在我的测试中,m2 覆盖了 m1。我想 return 在第一次通话中使用 m1,在第二次通话中使用 m2。

怎么做?

您可以使用 onCall(n) (or the aliases onFirstCall, onSecondCall, and onThirdCall) 定义第 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
});