Javascript 无法测试控制器的服务调用
我正试图编写一个代码来测试在我的控制器中完成的服务调用。我试图在控制器中对特定功能进行单元测试,该功能正在执行服务调用并带来数据。目前我正在尝试使用本地json,但它实际上会执行一个服务调用 我知道,首先我创建了一个spy对象,但是我得到的错误是“TypeError:jasmine.CreateSpyObj不是一个函数”,我对单元测试是新手。我无法创建间谍对象,因此无法继续。正在粘贴我的代码,请您帮助我 此外,我不确定一旦我成功创建了spyObject,我到底要做什么,我实际上想测试我的服务是否受到了良好的攻击,我是否得到了服务的响应 请帮帮我,我从很多天以来一直在努力 服务代码:Javascript 无法测试控制器的服务调用,javascript,angularjs,karma-jasmine,Javascript,Angularjs,Karma Jasmine,我正试图编写一个代码来测试在我的控制器中完成的服务调用。我试图在控制器中对特定功能进行单元测试,该功能正在执行服务调用并带来数据。目前我正在尝试使用本地json,但它实际上会执行一个服务调用 我知道,首先我创建了一个spy对象,但是我得到的错误是“TypeError:jasmine.CreateSpyObj不是一个函数”,我对单元测试是新手。我无法创建间谍对象,因此无法继续。正在粘贴我的代码,请您帮助我 此外,我不确定一旦我成功创建了spyObject,我到底要做什么,我实际上想测试我的服务是否
//app is the module name
app.factory('appServices', ['$rootScope', '$http', function($rootScope,
$http) {
var appServices = {};
appServices.getData = function(){
return $http.get(scripts/services/data/unitTesting.json');
};
unitTesting.json代码:
{
"name":"unit testing",
"countryCode": "EG",
"countryName": "Egypt",
"region": "Africa"
}
控制器代码:
getData: function(){
appServices.getData().then(function(response) {
if (response && response.data) {
$scope.testVariable= response.data.name;
}
});
},
单元测试代码:
describe('myCtrl', function() {
beforeEach(module('app'));
var $controller;
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('service call test', function() {
var $http,$httpBackend,appServices,
myService,$q,$rootScope,controller;
var mockItem =
{
"name":"unit testing",
"countryCode": "EG",
"countryName": "Egypt",
"region": "Africa"
}
beforeEach(inject(function(_$http_,_$httpBackend_,appServices,_$q_,
_$rootScope_) {
$http = _$http_;
$httpBackend = _$httpBackend_;
appServices = appServices;
$rootScope = _$rootScope_;
$q =_$q_;
jasmine.spyOn(appServices, 'getData').and.returnValue($q.when(mockItem));
controller = $controller('myCtrl', { $scope: $scope });
}));
it('Service call test ', function() {
controller = $controller('myCtrl', { $scope: $rootScope.new() });
controller.getData();
expect(appServices.getData).toHaveBeenCalled();
});
});
});
错误:
TypeError: jasmine.spyOn is not a function
使用
spyOn
功能:
jasmine.spyOn(appServices, 'getData');
然后,您可以在测试中检查调用,如:
expect(appServices.getData).toHaveBeenCalled();
看看您是如何编写规范的,我可以建议一些其他更改以帮助您运行规范:
var $rootScope,
controller,
$q;
beforeEach(inject(function(_$http_,_$httpBackend_,appServices,_$q_, _$rootScope_){
$http = _$http_;
$httpBackend = _$httpBackend_;
appServices= appServices;
$rootScope = _$rootScope_;
$q = _$q_;
jasmine.spyOn(appServices, 'getData').and.returnValue($q.when(mockItem));
controller = $controller('myCtrl', { $scope: $scope });
}));
describe('when fetching data in the controller', function(){
it('should delegate the call to appServices.getData()', function() {
controller = $controller('myCtrl', { $scope: $rootScope.new() });
controller.getData();
expect(appServices.getData).toHaveBeenCalled();
});
});
它应该是小写:
jasmine.createSpyObj
非常感谢您的帮助,这是我的错误。你能告诉我测试我的服务呼叫成功与否的进一步步骤吗。我在网上看到了许多解决方案,我发现它们令人困惑。如果你能进一步帮助,那就太好了。你用的是哪个版本的茉莉花?@DarrenSweeney-its-jasmin-2.8。0@VitaliyGorbenko,我已经编辑了我的单元测试代码,并相应地编辑了我的问题,但我仍然得到了错误。请看一看我的代码,编辑了原始问题并显示错误消息。是否有任何方法与您单独连接。我觉得我的代码中缺少了一些重要的东西。