如何使用jasmine karma测试angularjs服务中的函数

如何使用jasmine karma测试angularjs服务中的函数,angularjs,karma-jasmine,Angularjs,Karma Jasmine,我不熟悉karma jasmine测试。我已经编写了一个服务,它使http get调用api并返回数据对象 app.service('service_name',['$http',function($http){ this.getData=function(urlPath){ var Data = $http.get(path).success(function(data){ var getData = data;

我不熟悉karma jasmine测试。我已经编写了一个服务,它使http get调用api并返回数据对象

app.service('service_name',['$http',function($http){
    this.getData=function(urlPath){
        var Data = $http.get(path).success(function(data){
                var getData = data;
                console.log("getData success");
                return getData;
            }).error(function(response){
                var getData = response;
                console.log("getData error");
                return getData;
            });

        console.log(Data);
        return Data;
    };
}]);
从控制器,我将url传递到此服务函数,并使用
获取数据。然后()
回调

service_name.getData(url).then(function(data){
    console.log('expected data: ', data);
});
我是这样做的:

首先,根据此设置测试环境

然后在测试规范中,使用以下测试模板来测试服务中的函数,感谢Ben Lesh的伟大贡献

“严格使用”;
描述('service_name',function()){
var服务名称,
httpBackend,
资源;
beforeach(函数(){
模块(“yourAppName”);
//注入器忽略此处的前导下划线和尾随下划线(即$httpBackend u)。
//这允许我们注入服务,但随后将其附加到变量
//使用与服务相同的名称,以避免名称冲突。
注入(函数($injector,\服务\名称){
服务\u名称=\u服务\u名称\u;
httpBackend=$injector.get(“$httpBackend”);
});
});
//确保测试中没有遗漏任何期望值。
//(例如,expectGET或expectPOST)
之后(函数(){
httpBackend.VerifyNoOutstandingExpection();
httpBackend.verifyNoOutstandingRequest();
});
它('应该有一个getData函数',函数(){
expect(angular.isFunction(service_name.getData)).toBe(true);
});
它('如果http请求成功,则getData函数应返回数据对象',函数(){
var expectedData=数据;
httpBackend.expectGET('urlPath')
.回应(预期数据);
var实际结果;
服务名称.getData().then(函数(响应){
实际结果=响应;
});
httpBackend.flush();
expect(实际结果)。toEqual(预期数据);
});
它('getData在http请求不成功时应返回错误消息',函数(){
httpBackend.expectGET('urlPath').respond(500);
var promise=service_name.getData('urlPath'),
结果=空;
承诺。然后(函数(foo){
结果=foo;
},功能(原因){
结果=原因;
});
httpBackend.flush();
expect(result).toBe(“getData错误”);
});

});当我在任何浏览器上运行应用程序时,所有ajax调用都正常工作。这些ajax调用在控制器“加载”时触发。但当我运行karma测试配置时,这些控制器被加载,但所有ajax调用都被跳过。您显示的是服务代码,而不是控制器。你想测试什么?如果您想捕获来自控制器的触发调用,则必须安装–service_name.getData(url).then(函数(数据){console.log('expected data:',data);});这段代码是在控制器内部编写的…这就是我提到控制器的原因请显示您的测试…或者更好的方式,请将这段代码分叉并为其实现您的服务和测试