6

Env環境情報をまとめるサービスを作成し、現在$location.host()どの環境にいるかを判断するために使用しています。テストでそれをどのようにモックしますか?

https://groups.google.com/forum/?fromgroups#!topic/angular/F0jFWC4G9hIを読みましたが、機能していないようです。たとえば、次のようになります。

describe("Env (environment) service", function() {

  var Env;

  beforeEach(module('App'));

  beforeEach(inject(
    ['Env', function(e) {
      Env = e;
    }]
  ));

  describe("for staging", function() {
    beforeEach(inject(function($location, $rootScope) {
      $location.host("http://staging-site.com");
      $rootScope.$apply();
    }));

    it("returns envrionment as staging", function() {
      expect(Env.environment).toEqual("staging");
    });

    it("returns .isStaging() as true", function() {
      expect(Env.isStaging()).toBeTruthy();
    });
  });
});

バリアントも試しました$browserが、どちらも機能しません。何か案は?

4

4 に答える 4

6

最良の方法は、私見のスパイを使用することです: http://tobyho.com/2011/12/15/jasmine-spy-cheatsheet/

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

jasmine 2.0 以降の構文は次のように変更されました。

// inject $location
spyOn($location, "host").and.returnValue("super.domain.com");
var host = $location.host();
alert(host) // is "super.domain.com"
expect($location.host).toHaveBeenCalled();
于 2013-10-01T07:51:19.183 に答える
4

同様の問題があり、 $injector サービスを使用しました。(それが最も簡単な解決策かどうかはわかりませんが、私にとってはうまくいきました:))

テスト中は $location に依存できないため、独自のモックを用意しました。まず、ファクトリ メソッドを作成する必要があります。(または、必要に応じてサービスまたはプロバイダー -比較のためにhttps://gist.github.com/Mithrandir0x/3639232を参照してください):

function locationFactory(_host) {
  return function () {
    return {
      /* If you need more then $location.host(), add more methods */
      host: function () {
        return _host;
      }
    };
  };
}

次に、 'Env' を作成する前に、この $location モックでインジェクターをフィードします。

module(function ($provide) {
  $provide.factory('$location', locationFactory('http://staging-site.com'));
});

これで、コード内の $location にアクセスするたびに、モックが挿入されるため、必要なものは何でも返されます。$provide メソッドの詳細は、Angular ドキュメントにあります

これが将来役立つことを願っています。

更新: 間違っている可能性がある場所が 1 つあります (または、少なくとも私のソリューションでは間違っている可能性があります)。「Env」モジュールを開始しているようです(これはすぐにデータを計算すると思います)。この後にのみ $location を変更します-これはすでに遅すぎる可能性があります。

于 2013-09-03T14:42:57.333 に答える