使用依赖项测试AngularJS服务

时间:2013-06-15 11:38:09

标签: unit-testing angularjs jasmine angularjs-service

我在AngularJS中测试一个简单的服务有som问题,这取决于另一个服务。

该服务看起来有点像这样:

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

一开始我只是尝试使用window.location.pathname而不是创建服务,但它似乎是错误的方式来模拟它。因此我创建了urlService,它基本上是一个围绕window-object的简单包装器。

然后我的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实际运行之前重载它。我可以更改'beforeEach',因此getPathName返回“test”,但是我无法测试url不等于test的情况。

1 个答案:

答案 0 :(得分:0)

您可以监视测试套件中的服务以更改行为:

spyOn(yourService, 'methodName');

关于如何实施间谍的jsFiddle有一个很好的例子:http://jsfiddle.net/robinroestenburg/aDwva/

这应该让你让它正常工作。