4

別のサービスに依存するAngularJSの単純なサービスをテストする際にいくつかの問題があります。

サービスは次のようになります。

serviceModule.factory('filtersService', ['$rootScope', 'urlService', function($rootScope, urlService){
        return {
            getFilters: function(){
                   if(urlService.getPathName() == "test")
                   {
                      return "something";
               }
    }]);

最初は、サービスを作成する代わりに window.location.pathname を使用しようとしましたが、それをモックできる方法が間違っているように思えました。したがって、urlService を作成しました。これは基本的に、ウィンドウ オブジェクトの単純なラッパーです。

次に、次のようなfiltersServiceTestがあります。

describe('filtersService test', function(){
    var filtersService, urlServiceMock;

    beforeEach(module('App.services'));

    beforeEach(function(){
        urlServiceMock = {
            getPathName: function(){
                return "";
            }
        };

        module(function($provide){
            $provide.value('urlService', urlServiceMock);
        });
    });

    it('Should return something if url is test', inject(function(filtersService){
        urlServiceMock = {
            getPathName: function(){
                return "test";
            }
        };

        expect(filtersService.getFilters()).not.toBe("something");
    }));
});

しかし、これはうまくいかないようです。実際に実行する前に urlServiceMock をオーバーロードすることはできません。getPathName が "test" を返すように ' ' をそれぞれ変更できbeforeEachますが、URL が test と等しくないシナリオをテストすることはできません。

4

1 に答える 1

0

テスト スイート内のサービスをスパイして、動作を変更できます。

spyOn(yourService, 'methodName');

スパイの実装方法に関する jsFiddle の優れた例があります: http://jsfiddle.net/robinroestenburg/aDwva/

これにより、正しく機能するようになります。

于 2013-06-15T14:47:40.543 に答える