清理容易的sinon存根

有没有一种方法可以轻松地重置所有的sinon spys mock和stubs,这些都可以在摩卡的beforeEach模块中清晰地工作。

我看到沙盒是一个选项,但我不明白你如何使用沙箱为此

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 

Sinon通过使用Sandbox来提供这个function,可以使用一些方法:

 // 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" })); 

@keithjgrant答案的更新。

从版本2.0.0开始, sinon.test方法已经被移植到单独的sinon-test模块中 。 为了使旧的testing通过,你需要在每个testing中configuration这个额外的依赖:

 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" } 

您可以使用sinon.collection,如本博客文章(date为2010年5月)由sinon库的作者所示。

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而不是摩卡时,您需要将这些包装在一个模块中,例如

 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'); } ); 

如果你想要一个设置,将有sinon总是重置本身的所有testing:

在helper.js中:

 import sinon from 'sinon' var sandbox; beforeEach(function() { this.sinon = sandbox = sinon.sandbox.create(); }); afterEach(function() { sandbox.restore(); }); 

那么,在你的testing中:

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

restore()只是恢复存根function的行为,但不会重置存根的状态。 你必须或者用sinon.test包装你的testing,然后使用this.stub或者在stub上分别调用reset()