指令

时间:2015-06-09 22:16:37

标签: angularjs

我有以下服务和指令:

angular.module("epcApp", [])
.service("epcData", function($http, $q){
    var urls = {
        load: "some-url",
        save: "some-url"
    };
    this.load = function(){
        return $http.get(urls.load).then(function(data){
            return data;
        });
    }
    this.save = function(req){
        return $http.get(urls.save, req).then(function(data){
            return data;
        });
    }
})
.directive("epc", ['epcData', function(epcData){
    return {
        restrict: "E",
        templateUrl: "some-url",
        link: function(scope, element, args, form){
            scope.collectSelects = function(container){
                // some code
            }

            scope.collectCheckBoxes = function(container){
                // some code
            }

            epcData.load().then(function(data){
                scope.userOptions = 
                // do something with scope.collectCheckBoxes and scope.collectSelects
            });
        }
    }
}]);

我想测试一下:

  1. epcData.load 是从指令内部调用的
  2. 来自 epcData.load 的承诺内
  3. collectSelects collectCheckboxes
  4. 我无法弄清楚如何模拟服务。这就是我在文档中看到的内容:

        //Load the EPC main module
        beforeEach(module('epcApp'));
    
        //Intialize the directive with a mock scope
        beforeEach(function(){
            var element, scope, epcData, $httpBackend, mock;
            mock = {
                load: jasmine.createSpy(),
                save: jasmine.createSpy()
            }
            module(function($provide){
                $provide.service('epcData', mock);
            })
            inject(function($rootScope, $compile, $injector){
                epcData = $injector.get('epcData');
                scope = $rootScope.$new();
                element = angular.element("<epc></epc>");
                element = $compile(element)(scope);
                scope.$digest();
            })
        });
    
        it("should have loaded data", function(){
            expect(mock.load).toHaveBeenCalled();
        })
    

    我收到以下错误Error: [ng:areq] Argument 'fn' is not a function, got Object

    如果我完全删除了$provide$injector部分,当实际epcData.load方法尝试执行http时,我收到'意外请求'错误请求。所以我似乎越来越接近覆盖服务方法,但我做错了。

1 个答案:

答案 0 :(得分:0)

错误即将发生,因为您需要传递构造函数来创建Angular服务。你正在传递一个物体。

您可以使用value功能代替service

$provide.value('epcData', mock);

或者你可以创建一个虚拟构造函数。

此外,jasmine spy的实现应返回一个promise,否则调用函数将失败(no then)。请参阅jasmine的文档并从虚函数返回$q.when()