如何让 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
});
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
});