当测试以异步方式运行时,如何使用sinon沙箱?

时间:2016-04-28 21:38:13

标签: javascript testing mocha sinon stub

我有一些代码我尝试使用这样的结构进行测试(每Cleaning up sinon stubs easily):

function test1() {
    // manually create and restore the sandbox
    var sandbox;
    beforeEach(function () {
        sandbox = sinon.sandbox.create();
        sandbox.stub(globalVar, "method", function() { return 1; });
    });

    afterEach(function () {
        sandbox.restore();
    });

    it('tests something', function(done) {
        anAsyncMethod(function() { doSomething(); done(); });
    }
 }

然后有一个类似的test2()函数。

但如果我这样做:

describe('two tests', function() {
    test1();
    test2();
}

我明白了:

TypeError: Attempted to wrap method which is already wrapped

我已完成一些日志记录以确定运行顺序,问题似乎是它运行test1 beforeEach()挂钩,然后是test2 beforeEach()挂钩,然后是test1 it()等等。因为它在第一次测试到达beforeEach()之前调用了第二个afterEach(),所以我们遇到了问题。

我应该更好地构建这个吗?

1 个答案:

答案 0 :(得分:1)

您的测试规范的结构应如下所示:

describe("A spec (with setup and tear-down)", function() {
  var sandbox;

  beforeEach(function() {
    sandbox = sinon.sandbox.create();
    sandbox.stub(globalVar, "method", function() { return 1; });
  });

  afterEach(function() {
    sandbox.restore();
  });

  it("should test1", function() {
    ...
  });

  it("should test2", function() {
    ...
  });
});

或者你可以这样做:

function test1() {
  ...
}

function test2() {
  ...
}

describe("A spec (with setup and tear-down)", function() {
  describe("test1", test1);
  describe("test2", test2);
});