web-dev-qa-db-fra.com

Nettoyer facilement les talons

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
121
austinbv

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

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

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();
});
10
Myk Willis

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

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)
})
6
sethcall

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.

4
Sandeep Adi

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