Node.js sinon在并行执行中存根函数会导致测试失败

时间:2016-05-27 11:27:36

标签: node.js unit-testing testing mocha sinon

我有2个测试用例,只测试2个不同的执行路径测试相同的函数,所以说明:

MyClass.prototype.functionBeingTested = function() {
    if (this.check1()) {
        this.isCheck1Called = true;
    } else if (this.check2()) {
        this.isCheck1Called = false;
    } else {
        ...
    }
};

我的2个测试用例如下:

it('should take check1() execution path', function() {
    var myClass= new MyClass({}, {}, {});
    var check1Stub sinon.stub(MyClass.prototype, 'check1');
    check1Stub.returns(true);
    myClass.functionBeingTested();
    myClass.isCheck1Called.should.equal(true);
});

it('should take check2() execution path', function() {
    var myClass= new MyClass({}, {}, {});
    var check2Stub sinon.stub(MyClass.prototype, 'check2');
    check2Stub.returns(true);
    myClass.functionBeingTested();
    myClass.isCheck1Called.should.equal(false);
});

现在默认情况下,check1()返回false,因此我不会在第二个测试用例中将其存根,但是在第二个案例运行时,check1()函数存根仍处于活动状态并导致第二种情况是进入第一种情况的执行路径,使第二种情况测试失败。

我理解这是一个并行运行的测试问题,第一个测试用例仍在使用第一个sinon存根,无论如何我能解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

在第一次测试结束时,您应该恢复原始方法(这总是一件好事,以防止测试受到先前测试的影响):

check1Stub.restore()

或者,您也可以使用Sinon sandbox在以下位置运行每个测试:

describe('MyClass', function() {

  beforeEach(function() {
    this.sinon = sinon.sandbox.create();
  });

  afterEach(function() {
    this.sinon.restore();
  });

  it('should take check1() execution path', function() {
      var myClass    = new MyClass({}, {}, {});
      // `this.sinon` is the sandbox
      var check1Stub = this.sinon.stub(MyClass.prototype, 'check1');
      check1Stub.returns(true);
      myClass.functionBeingTested();
      myClass.isCheck1Called.should.equal(true);
  });

  it('should take check2() execution path', function() {
      var myClass    = new MyClass({}, {}, {});
      var check2Stub = this.sinon.stub(MyClass.prototype, 'check2');
      check2Stub.returns(true);
      myClass.functionBeingTested();
      myClass.isCheck1Called.should.equal(false);
  });
});

(参见mocha-sinon,完全相同)