我们的测试组织如下:
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
。
任何帮助了解这里发生的事情都会非常感激。
答案 0 :(得分:1)
问题是Mocha执行代码的顺序。使用describe
将回调包装到sinon.test
无法正常工作。那是因为所有describe
的回调在<{em} it
中的任何测试开始执行之前完成了的执行。 sinon.test
的工作方式,它会创建一个新的沙箱,使用沙箱的一些方法this
(spy
,stub
等),然后调用其回调,当回调返回时, sinon.test
从this
中删除它添加的方法。
因此,在运行任何测试之前,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();
});
});