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。我可以更改“ beforeEach”每个,以便 getPathName 返回“test”,但是我将无法测试 url 不等于 test 的场景。

4

1 回答 1

0

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

spyOn(yourService, 'methodName');

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

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

于 2013-06-15T14:47:40.543 回答