web-dev-qa-db-fra.com

jasmine: spyOn (obj, 'méthode'). andCallFake ou and.callFake?

Je veux me moquer des données de test dans mes tests Jasmine. Voici deux versions:

// version 1:
spyOn(mBankAccountResource, 'getBankAccountData').and.callFake(fakedFunction);

// version 2:
spyOn(mBankAccountResource, 'getBankAccountData').andCallFake(fakedFunction);

Lorsque j'exécute mes tests avec un navigateur (Chrome, Firefox), la première version fonctionne. Cependant, lorsque je lance le même test avec phantomjs, je dois utiliser la deuxième version. Sinon, il se plaint que la fonction n'est pas définie.

Voici les messages d'erreur:

// phantomjs (with version 1)
    TypeError: 'undefined' is not an object (evaluating 'spyOn(mBankAccountResource, 'getBankAccountData').and.callFake')
    at /home/phil/workspaces/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65
    at invoke (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular/angular.js:3707)
    at workFn (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular-mocks/angular-mocks.js:2149)
undefined

// Chrome (with version 2)
TypeError: Object function () {
        callTracker.track({
          object: this,
          args: Array.prototype.slice.apply(arguments)
        });
        return spyStrategy.exec.apply(this, arguments);
      } has no method 'andCallFake'
    at Object.<anonymous> (/home/phil/workspaces/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65:59)
    at Object.invoke (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular/angular.js:3707:17)
    at Object.workFn (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular-mocks/angular-mocks.js:2149:20)

J'ai cherché l'API Jasmine mais je n'ai pas pu trouver quelle version est la bonne. Tous les exemples que j'ai trouvés semblent utiliser la deuxième version.

L'API de Jasmine a-t-elle changé récemment? Comment puis-je écrire mes tests pour qu'elle fonctionne toujours?

41
Philipp Claßen

Oui, l'API espion est passée de Jasmine 1.3.1 à Jasmine 2.0. Il n'y a pas de version "correcte". Si vous pouvez trouver le support d’outil pour Jasmine 2.0, je vous recommanderais de le mettre à jour.

Syntaxe Jasmine 1.3.1 ( documentation )

spyOn(mBankAccountResource, 'getBankAccountData').andCallFake(fakedFunction);
expect(mBankAccountResource.getBankAccountData.mostRecentCall.args).toEqual(["foo"]);

Syntaxe Jasmine 2.0 ( documentation )

// Methods moved to 'and' property
spyOn(mBankAccountResource, 'getBankAccountData').and.callFake(fakedFunction);

// Call data moved to 'calls' property
expect(mBankAccountResource.getBankAccountData.calls.mostRecent().args).toEqual(["foo"]);

Je parle du support d’outil parce qu’il semble que c’est le problème que vous rencontrez. Jasmine 2.0 n'est sorti que depuis quelques mois (au moment de la rédaction de cet article). La prise en charge de Jasmine 2.0 dans Karma, en comparaison, est suspendue depuis quelques semaines (je ne suis pas sûr d’autres outils).

Pour résoudre votre problème, déterminez le ou les outils que vous utilisez pour exécuter des tests et vérifiez si l'un d'entre eux prend en charge Jasmine 2.0. Si tous le font, alors optez pour la mise à niveau. Sinon, rétrogradez vos tests de navigateur à Jasmine 1.3.1 et attendez que le support des outils soit amélioré. Assurez-vous simplement que vous êtes cohérent dans tous les domaines.

64
Eric