web-dev-qa-db-fra.com

Réinitialiser l'appel sur Jasmine Spy ne revient pas

J'utilise un espion Jasmine (2.2.0) pour voir si un certain rappel est appelé.

Code de test:

it('tests', function(done) {
  var spy = jasmine.createSpy('mySpy');
  objectUnderTest.someFunction(spy).then(function() {
    expect(spy).toHaveBeenCalled();
    done();
  });
});

Cela fonctionne comme prévu. Mais maintenant, j'ajoute un deuxième niveau:

it('tests deeper', function(done) {
  var spy = jasmine.createSpy('mySpy');
  objectUnderTest.someFunction(spy).then(function() {
    expect(spy).toHaveBeenCalled();
    spy.reset();
    return objectUnderTest.someFunction(spy);
  }).then(function() {
    expect(spy.toHaveBeenCalled());
    expect(spy.callCount).toBe(1);
    done();
  });
});

Ce test ne revient jamais, car apparemment le rappel done n'est jamais appelé. Si je supprime la ligne spy.reset(), le test se termine, mais échoue évidemment à la dernière attente. Cependant, le champ callCount semble être undefined, plutôt que 2.

20
Jorn

La syntaxe de Jasmine 2 est différente de 1.3 en ce qui concerne les fonctions d'espionnage. Voir les documents Jasmine ici .

Plus précisément, vous réinitialisez un espion avec spy.calls.reset();

Voici à quoi devrait ressembler le test:

// Source
var objectUnderTest = {
    someFunction: function (cb) {
        var promise = new Promise(function (resolve, reject) {
            if (true) {
                cb();
                resolve();
            } else {
                reject(new Error("something bad happened"));
            }
        });
        return promise;
    }
}

// Test
describe('foo', function () {
    it('tests', function (done) {
        var spy = jasmine.createSpy('mySpy');
        objectUnderTest.someFunction(spy).then(function () {
            expect(spy).toHaveBeenCalled();
            done();
        });
    });
    it('tests deeper', function (done) {
        var spy = jasmine.createSpy('mySpy');
        objectUnderTest.someFunction(spy).then(function () {
            expect(spy).toHaveBeenCalled();
            spy.calls.reset();
            return objectUnderTest.someFunction(spy);
        }).then(function () {
            expect(spy).toHaveBeenCalled();
            expect(spy.calls.count()).toBe(1);
            done();
        });
    });
});

Voir violon ici

34
Eitan Peer

Une autre façon de l'écrire:

spyOn(foo, 'bar');
expect(foo.bar).toHaveBeenCalled();
foo.bar.calls.reset();
3
Steve Brush