【问题标题】:Testing a AngularJS services with dependencies使用依赖项测试 AngularJS 服务
【发布时间】:2013-06-11 23:21:06
【问题描述】:

我在 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 的场景。

【问题讨论】:

    标签: unit-testing angularjs jasmine angularjs-service


    【解决方案1】:

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

    spyOn(yourService, 'methodName');
    

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

    这应该可以让您正常工作。

    【讨论】:

    • 引用的 jsfiddle 丢失
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多