如何使用 sinon 将同一个方法替换为两个不同的 return 值?

How to use sinon to replace the same method with two different return values?

我正在单元测试的一个方法在该方法中多次调用具有不同参数的同一个辅助方法。为了让我测试我的方法,我想使用 sinon 的 replace 函数用我的模拟数据替换这个辅助方法的 return 值,但是我每次调用那个辅助方法时都需要 return不同的模拟数据。我该怎么做?

举个例子:

const obj = {
  foo(num) {
    return 5 + num;
  },
  methodToTest() {
    return foo(1) + foo(2);
  },
};

我想测试 methodToTest() 是否可以正常工作,如果 foo returns 6 以参数值 1 调用时,foo returns 7 以参数值 2 调用时。

我想我正在寻找的是一种根据传入的参数替换 foo 的 return 值的方法,例如:

   sinon.replace(obj, 'foo(1)', sinon.fake.returns(6));
   sinon.replace(obj, 'foo(2)', sinon.fake.returns(7));

知道我该怎么做吗?将不胜感激。

只需创建一个伪造的 foo 函数,它根据参数动态提供多个 return 值。

例如

index.js:

const obj = {
  foo(num) {
    return 5 + num;
  },
  methodToTest() {
    return this.foo(1) + this.foo(2);
  },
};

module.exports = obj;

index.test.js:

const obj = require('./');
const sinon = require('sinon');

describe('68463040', () => {
  it('should pass', () => {
    function fakeFoo(arg) {
      if (arg == 1) {
        return 6;
      }
      if (arg == 2) {
        return 7;
      }
    }
    sinon.replace(obj, 'foo', fakeFoo);
    const actual = obj.methodToTest();
    sinon.assert.match(actual, 13);
  });
});

测试结果:

  68463040
    ✓ should pass


  1 passing (3ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |      75 |      100 |      50 |      75 |                   
 index.js |      75 |      100 |      50 |      75 | 3                 
----------|---------|----------|---------|---------|-------------------