9

私は単純なangularjsフィルターを持っています(それはidを取り、それを名前文字列に変換します)、それはその仕事をするためにカスタムサービスに依存します:

angular.module('app').filter('idToName',
  function(User) {
    return function(id) {
      var result, user;
      result = '';
      if (id) {
        result = 'no name found';
        user = User.getById(id);
        if (user) {
          result = user.firstName;
        }
      }
      return result;
    };
  }
);

ユニットテストを書きたいと思います。ユーザーサービスのモックをテストに注入できるようにしたいと思います。

ドキュメントに示されているように、コントローラーユニットテストでこれを行うことができます。

var mockUserService;

mockUserService = {
  getById: function(id) {
    return {
      firstName: 'Bob'
    };
  }
};

beforeEach(inject(function($rootScope, $controller) {
  var ctrl, scope, userService;
  userService = mockUserService;
  scope = $rootScope.$new();
  return ctrl = $controller('someController', {
    $scope: scope,
    User: userService
  });
}));

ただし、beforeEachで$controllerを$filterに置き換えても機能しません。これは、フィルターが角度によって異なる方法で構築されていると想定しているためです(つまり、コンストラクターの2番目のパラメーターとしてローカルを挿入することはできません)。

誰かがこれに出くわした/これを以前に解決したことがありますか?

4

1 に答える 1

13

わかりました、主にこの答えのおかげでこれを理解しました 。

秘訣は、それぞれの前にangular-mocks.jsモデル関数を使用して、サービスのファクトリプロバイダーを単純にオーバーライドすることでした(angularは最後に定義されたファクトリを取得するだけです)

beforeEach(module(function($provide) {
  $provide.factory('User', function() {
    var getSync;
    getById = function(id) {
      return {
        firstName: 'Bob'
      };
    };
    return {
      getById: getById
    };
  });
}));

テスト間の分解には注意が必要だと思いますが、フィルターへの注入は正常に機能するようになりました。

于 2013-03-09T00:01:05.397 に答える