Existe-t-il un moyen de réinitialiser facilement tous les mock et stubs sinon spys qui fonctionneront proprement avec les blocs beforeEach de moka?.
Je vois que le sandboxing est une option mais je ne vois pas comment vous pouvez utiliser un bac à sable pour cela
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 fournit cette fonctionnalité en utilisant Sandbox , qui peut être utilisé de plusieurs manières:
// 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"
}
ou
// 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"
}));
Une mise à jour de la réponse @keithjgrant.
A partir de la version v2.0.0 , la méthode sinon.test a été déplacé vers n module sinon-test
séparé . Pour réussir les anciens tests, vous devez configurer cette dépendance supplémentaire dans chaque test:
var sinonTest = require('sinon-test');
sinon.test = sinonTest.configureTest(sinon);
Alternativement, vous faites sans sinon-test
Et utilisez bacs à sable :
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"
}
Les réponses précédentes suggéraient d'utiliser sandboxes
pour accomplir cela, mais selon la documentation :
Depuis [email protected], l'objet sinon est un sandbox par défaut.
Cela signifie que nettoyer vos bouts/mocs/espions est maintenant aussi facile que:
var sinon = require('sinon');
it('should do my bidding', function() {
sinon.stub(some, 'method');
}
afterEach(function () {
sinon.restore();
});
Vous pouvez utiliser sinon.collection comme illustré dans this blog (daté de mai 2010) par l'auteur de la bibliothèque sinon.
L'API sinon.collection a changé et une façon de l'utiliser est la suivante:
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');
}
Si vous voulez une configuration qui aura sinon sinon toujours se réinitialiser pour tous les tests:
dans helper.js:
import sinon from 'sinon'
var sandbox;
beforeEach(function() {
this.sinon = sandbox = sinon.sandbox.create();
});
afterEach(function() {
sandbox.restore();
});
Ensuite, dans votre test:
it("some test", function() {
this.sinon.stub(obj, 'hi').returns(null)
})
restore()
restaure simplement le comportement de la fonctionnalité stub mais ne réinitialise pas l'état des stubs. Vous devrez soit envelopper vos tests avec sinon.test
Et utiliser this.stub
, Soit appeler individuellement reset()
sur les talons.
Notez que lorsque vous utilisez qunit au lieu de mocha, vous devez les envelopper dans un module, par exemple.
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');
}
);