容易清理树桩

有没有一种方法可以轻松地重置所有的罪恶间谍模拟和存根,将与摩卡的前每块干净的工作。

我看到沙箱是一种选择,但我不知道如何可以使用沙箱这一点

beforeEach ->
sinon.stub some, 'method'
sinon.stub some, 'mother'


afterEach ->
# I want to avoid these lines
some.method.restore()
some.other.restore()


it 'should call a some method and not other', ->
some.method()
assert.called some.method
115194 次浏览

Sinon 通过使用 沙盒提供了这种功能,可以通过以下几种方式使用:

// manually create and restore the sandbox
var sandbox;
beforeEach(function () {
sandbox = sinon.sandbox.create();
});


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


it('should restore all mocks stubs and spies between tests', function() {
sandbox.stub(some, 'method'); // note the use of "sandbox"
}

或者

// wrap your test function in sinon.test()
it("should automatically restore all mocks stubs and spies", sinon.test(function() {
this.stub(some, 'method'); // note the use of "this"
}));

您可以使用 sinon.Collection,正如 sinon 库的作者在 这个 blog post (日期为2010年5月)中所说明的那样。

Sinon.Collection api 已经更改,使用它的方法如下:

beforeEach(function () {
fakes = sinon.collection;
});


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


it('should restore all mocks stubs and spies between tests', function() {
stub = fakes.stub(window, 'someFunction');
}

注意,当使用 qunit 代替 mocha 时,您需要将它们包装在一个模块中,例如。

module("module name"
{
//For QUnit2 use
beforeEach: function() {
//For QUnit1 use
setup: function () {
fakes = sinon.collection;
},


//For QUnit2 use
afterEach: function() {
//For QUnit1 use
teardown: function () {
fakes.restore();
}
});


test("should restore all mocks stubs and spies between tests", function() {
stub = fakes.stub(window, 'someFunction');
}
);

restore()只是恢复存根功能的行为,但不会重置存根的状态。您必须用 sinon.test包装您的测试并使用 this.stub,或者在存根上单独调用 reset()

如果你想要一个有 sinon 的设置,总是为所有的测试重置它自己:

在 helper.js 中:

import sinon from 'sinon'


var sandbox;


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


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

然后,在你的测试中:

it("some test", function() {
this.sinon.stub(obj, 'hi').returns(null)
})

更新到@keithjgrant 的答案。

V2.0.0版本开始,Sinon 测试方法被移到了 一个单独的 sinon-test模块。为了使旧的测试通过,您需要在每个测试中配置这个额外的依赖项:

var sinonTest = require('sinon-test');
sinon.test = sinonTest.configureTest(sinon);

或者,你可以不使用 sinon-test而使用 沙盒:

var sandbox = sinon.sandbox.create();


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


it('should restore all mocks stubs and spies between tests', function() {
sandbox.stub(some, 'method'); // note the use of "sandbox"
}

以前的答案建议使用 sandboxes来实现这一点,但根据 文件:

由于 sinon@5.0.0,sinon 对象是默认的沙箱。

这意味着,现在清理你的存根/模仿/间谍就像下面这样简单:

var sinon = require('sinon');


it('should do my bidding', function() {
sinon.stub(some, 'method');
}


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

创建一个沙盒,这将作为一个黑盒容器的所有间谍,存根,模拟和假货。

您所需要做的就是在第一个描述块中创建一个沙箱,这样,它就可以在所有测试用例中访问。一旦您完成了所有的测试用例,您应该释放原始的方法,并在每个钩子之后使用方法 sandbox.restore()清理存根,以便在运行时它释放阻碍资源 afterEach测试用例通过或失败。

这里有一个例子:

 describe('MyController', () => {
//Creates a new sandbox object
const sandbox = sinon.createSandbox();
let myControllerInstance: MyController;


let loginStub: sinon.SinonStub;
beforeEach(async () => {
let config = {key: 'value'};
myControllerInstance = new MyController(config);
loginStub = sandbox.stub(ThirdPartyModule, 'login').resolves({success: true});
});
describe('MyControllerMethod1', () => {
it('should run successfully', async () => {
loginStub.withArgs({username: 'Test', password: 'Test'}).resolves();
let ret = await myControllerInstance.run();
expect(ret.status).to.eq('200');
expect(loginStub.called).to.be.true;
});
});
afterEach(async () => {
//clean and release the original methods afterEach test case at runtime
sandbox.restore();
});
});

下面将重置所有存根和嵌套存根。

sinon.reset();

或者是你 NameOfFunctiontionYouWantToReset.resetHistory();

喜欢 addingStub.resetHistory();