2013-03-08 13 views
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; 
    }; 
    } 
); 

を、私はそれのためのユニットテストを書きたいです。私はテストにUserサービスのモックを注入できるようにしたいと思います。

私はドキュメントに示すように、コントローラユニットテストのためにこれを行うことができます

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で$フィルタで$コントローラを交換するには動作しません、私はフィルタを推測として、角度によって異なって構成されています(つまり、コンストラクタの2番目のパラメータとしてローカルを挿入することはできません。)

誰もこれを遭遇したことはありませんか?

答えて

13

オクラホマ、これはおおよそ thisという回答に感謝しました。

トリックは

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

I(ちょうどそれが思わ最後に定義された工場をとる角度)それぞれの前に角度-mocks.jsモデル関数を使用することにより、単にサービスの工場プロバイダを上書きすることでしたテストの間にティアダウンに注意する必要があるだろうと思うが、フィルタへの注入は正常に機能するようになる。

関連する問題