web-dev-qa-db-fra.com

Attendu un espion, mais a la fonction

J'essaye d'implémenter un test (1) pour ce module (2).
Mon but est de vérifier si la collection est récupérée lorsqu’un événement particulier est déclenché.
Comme vous pouvez le voir d'après mon commentaire dans (2) je reçois le message Error: Expected a spy, but got Function.
Le module fonctionne mais le test échoue. des idées? 


(1)

// jasmine test module

describe('When onGivePoints is fired', function () {
    beforeEach(function () {
        spyOn(this.view.collection, 'restartPolling').andCallThrough();
        app.vent.trigger('onGivePoints');
    });
    it('the board collection should be fetched', function () {
        expect(this.view.collection.restartPolling).toHaveBeenCalled();
       // Error: Expected a spy, but got Function.
    });
});

(2)

// model view module
return Marionette.CompositeView.extend({
    initialize: function () {
        this.collection = new UserBoardCollection();
        this.collection.startPolling();
        app.vent.on('onGivePoints', this.collection.restartPolling);
    },
    // other code
});
22
Lorraine Bernard

Vous devez entrer dans la méthode actuelle, qui dans ce cas est sur le prototype. 

describe('When onGivePoints is fired', function () {
    beforeEach(function () {
        spyOn(UsersBoardCollection.prototype, 'restartPolling').andCallThrough();
        app.vent.trigger('onGivePoints');
    });
    it('the board collection should be fetched', function () {
        expect(UsersBoardCollection.prototype.restartPolling).toHaveBeenCalled();
    });
});

Espionner le prototype est une astuce intéressante que vous pouvez utiliser lorsque vous ne pouvez pas accéder à l'instance réelle que vous souhaitez espionner.

38
antonjs

J'avais aussi le même problème mais je l'ai résolu en passant un argument dans l'appel de fonction. Ensuite, vous devez écrire votre cas de test comme ceci dans la variable it

var data = {name:"test"}
spyOn(UsersBoardCollection.prototype, "restartPolling").and.callThrough();
UsersBoardCollection.prototype.restartPolling(data);
expect(UsersBoardCollection.prototype.restartPolling).toHaveBeenCalled();
3
Tabish

J'ai eu ce bogue parce que j'avais deux versions de sinon chargé, ou peut-être que je n'avais pas initialisé sinon sinon-jasmine correctement. Quand j’ai explicitement chargé sinon puis jasmine dans ma configuration, il s’est correctement mis en marche.

0
bnolan