包含在sinon.test中的摩卡测试正在失去对间谍,模拟和存根的访问权限

时间:2016-12-14 00:04:01

标签: javascript unit-testing mocha sinon

我们的测试组织如下:

describe("description", sinon.test(function() {
    const harness = this;
    it("should do something", function() {
        // do something with harness.spy, harness.mock, harness.stub
    });
}));

运行时,这些测试都会失败TypeError: harness.spy is not a function。我添加了一些日志,发现harness.spy存在,并且在调用传递给it的函数之前是一个函数,但函数内部传递给it,{{1} }是harness.spy

任何帮助了解这里发生的事情都会非常感激。

1 个答案:

答案 0 :(得分:1)

问题是Mocha执行代码的顺序。使用describe将回调包装到sinon.test无法正常工作。那是因为所有describe的回调在<{em} it中的任何测试开始执行之前完成了的执行。 sinon.test的工作方式,它会创建一个新的沙箱,使用沙箱的一些方法thisspystub等),然后调用其回调,当回调返回时, sinon.testthis中删除它添加的方法

因此,在运行任何测试之前,sinon.test包装describe回调所执行的任何设置都将被撤消。这是我放置一些console.log的示例。在运行任何测试之前,您将看到两个console.log语句都已执行。

const sinon = require("sinon");

describe("description", sinon.test(function() {
    const harness = this;
    it("should do something", function() {
    });

    console.log("end of describe");
}));

console.log("outside");

您需要将传递的回调换行到it,而不是像这样:

const sinon = require("sinon");

describe("description", function() {
    it("should do something", sinon.test(function() {
        this.spy();
    }));
});

console.log("outside");

如果sinon.test创建的沙箱的生命周期对您不起作用,那么您必须创建沙箱并“手动”清理它,如下所示:

const sinon = require("sinon");

describe("description", function() {
    let sandbox;
    before(function () {
        sandbox = sinon.sandbox.create();
    });
    after(function () {
        sandbox.restore();
    });
    it("should do something", function() {
        sandbox.spy();
    });
    it("should do something else", function() {
        // This uses the same sandbox as the previous test.
        sandbox.spy();
    });
});