如何让sinon mock在不同的调用中返回不同的对象?

问题描述 投票:1回答:1
 mock = sinon.mock();
 mock.exactly(2);
 mock.callsArgWith(1, m1);
 mock.callsArgWith(1, m2);

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

怎么做?

node.js unit-testing mocking sinon spy
1个回答
1
投票

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

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
});
© www.soinside.com 2019 - 2024. All rights reserved.