容易清理兴农存根(Cleaning up sinon stubs easily)

2019-06-26 09:41发布

有没有一种方法可以轻松地重置所有兴农spys嘲弄和存根将与摩卡的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

Answer 1:

兴农提供通过使用此功能沙箱 ,可用于几个方面:

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


Answer 2:

如所示,您可以使用sinon.collection 本博客文章由兴农库的作者(日期为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');
}


Answer 3:

更新到@keithjgrant答案。

从版本V2.0.0,sinon.test方法已被移动到一个单独的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"
} 


Answer 4:

如果你想有一个设置,将有兴农总是自行复位所有测试:

在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)
})


Answer 5:

注意,使用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');
    }
);


Answer 6:

restore()刚刚恢复的存根功能的行为,但它不重置存根的状态。 你必须要么包裹你的测试sinon.test和使用this.stub或单独调用reset()的存根



Answer 7:

以前的答案建议使用sandboxes来做到这一点,但是根据文档 :

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

这意味着,清理你的存根/嘲笑/间谍现在一样简单:

var sinon = require('sinon');

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

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


文章来源: Cleaning up sinon stubs easily