当另一个函数调用时,存根函数不会返回正确的值

时间:2016-09-01 08:51:45

标签: javascript sinon

我有函数A,它从函数B获取一个值并将其与一个字符串进行比较。如果匹配则返回true,否则返回false。

function A(random) {
    var something = B();
    if (random === something) {
        return true;
    } else {
        return false;
    }
}

function B() {
    var something = 'hello';

    return something;
}

我的测试看起来像这样

test("Test ", function () {
    //Arrange
    var expected = true;
    var random = "hi";
    var B = sinon.stub();
    B.returns(random);

    //Act
    var actual = A('hi'); 

    //Assert
    deepEqual(actual, expected);
});

我已经成功删除了函数B,使用Sinon返回我选择的值。当我在测试中直接调用函数B时它返回存根值,但是当我调用函数A时它不再返回存根值,任何想法为什么?

2 个答案:

答案 0 :(得分:1)

您实际上并不是AB函数,只是创建一个具有相同名称的新本地函数。

如果要注入(替换)函数函数,则必须以更加测试驱动的方式重构代码(即使用对象,没有本地函数,dependency inversion ...)。

或者使用像rewire这样的工具来修改本地模块范围变量并注入存根/伪造变量。

// same as require, but create a new copy (not cached)
// with  __set__ and __get__ methods:

var myModule = rewire('./myModule')
  , stubbedB = sinon.stub();

myModule.__set__("B", stubbedB);
myModule.__get__("A"); 

答案 1 :(得分:0)

您可以进行一些重构,以便不需要rewire之类的任何其他软件包。

例如

index.js

function A(random) {
  const something = exports.B();
  if (random === something) {
    return true;
  } else {
    return false;
  }
}

function B() {
  const something = 'hello';

  return something;
}

exports.A = A;
exports.B = B;

index.test.js

const mod = require('./');
const sinon = require('sinon');
const { expect } = require('chai');

describe('39266915', () => {
  afterEach(() => {
    sinon.restore();
  });
  it('should return true', () => {
    sinon.stub(mod, 'B').returns('hi');
    const actual = mod.A('hi');
    expect(actual).to.be.true;
  });

  it('should return false', () => {
    sinon.stub(mod, 'B').returns('hello');
    const actual = mod.A('hi');
    expect(actual).to.be.false;
  });
});

具有覆盖率报告的单元测试结果:

  39266915
    ✓ should return true
    ✓ should return false


  2 passing (9ms)

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

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/39266915