6
votes

Comment mock $ emplacement.Host () dans les tests angularjs?

J'ai créé un service env qui envoie des informations sur l'environnement et j'utilise actuellement $ emplacement.host () pour déterminer quel environnement je vais. Comment puis-je me moquer de cela dans mes tests?

J'ai lu https : //groups.google.com/forum/? Fromgroups #! Sujet / Angulaire / F0JFWC4G9HI , mais il ne semble pas fonctionner, par exemple: xxx p> J'ai aussi essayé le navigateur $ variante, mais cela ne fonctionne pas non plus. Des idées?


3 commentaires

J'ai aussi essayé $ navigateur.url () selon thecssninja.com/javaScript/angular-locallocation-lesting , mais cela ne fonctionne pas non plus.


J'ai un problème similaire, j'ai besoin d'injecter $ Emplacement dans mon test depuis que le service l'exige.


github.com/angular/angular.js/issues/493


4 Réponses :


4
votes

J'ai eu un problème similaire et j'ai utilisé $ service d'injecteur. (Je ne sais pas si c'est la solution la plus simple, mais cela a fonctionné pour moi :))

Depuis $ Emplacement ne peut pas être invoqué pendant les tests que j'ai préparé ma propre simule. Tout d'abord, vous devez créer une méthode d'usine. (Ou service ou fournisseur si vous préférez - voir https://gist.github.com/mithrandir0x/3639232 à comparaison): xxx

puis avant de créer votre "env '" , injecteur d'alimentation avec ce $ Emplacement Mock: < PRE> XXX

MAINTENANT à chaque fois votre accès $ Emplacement dans votre code Votre simulte est injecté, de sorte qu'il retourne tout ce que vous en avez besoin. Plus d'informations sur $ Fourniture est dans Documents angulaires

J'espère que cela vous aide à l'avenir.

mise à jour: je vois un endroit où vous auriez peut-être mal tourné (ou lequel au moins serait faux dans ma solution). Il semble que vous initiez que vous initiez le module «env» (que je suppose calcule immédiatement les données) et seulement après cela, vous avez changé $ Emplacement - ce qui pourrait être déjà trop tard.


0 commentaires

6
votes

Le meilleur moyen est d'utiliser des espions IMHO: http: // TobyHo .COM / 2011/12/15 / JASMINE-SPY-CHEXTHEETHEETH /

// inject $location
spyOn($location, "host").and.returnValue("super.domain.com");
var host = $location.host();
alert(host) // is "super.domain.com"
expect($location.host).toHaveBeenCalled();


1 commentaires

La syntaxe de Jasmine 2.0 et plus a changé, vous devriez utiliser .et.ReturnValue ()



0
votes

Voici une autre façon de se moquer de $ Emplacement, avec sinon.js xxx

et un exemple assertion: xxx


0 commentaires

2
votes

Il y a un bon exemple dans le doc: https://docs.angularjs.org/guide/services

Vous voulez vous assurer d'utiliser $ fournir code> avant d'instancier le service. J'aime utiliser injecteur code> dans la TESTCASE, pour décider d'abord de l'emplacement, puis instanciez le service. P> xxx pré>

alors p>

  describe('production server:', function() {
    beforeEach(function() {
      // mockLocation.host.andReturn('prod.example.com'); // jasmine 1.x
      mockLocation.host.and.returnValue('prod.example.com');
    });

    it('returns envrionment as production', inject(function($injector) {
      Env = $injector.get('Env');
      expect(Env.environment).toEqual('production');
    }));
  });


0 commentaires