Javascript 无法对通过控制器发生的http调用进行单元测试
我正试图编写一个代码来测试在我的控制器中完成的服务调用。我试图在控制器中对特定功能进行单元测试,该功能正在执行服务调用并带来数据。目前我正在尝试使用本地json,但它实际上会执行一个服务调用 我知道首先我必须创建一个spy对象,但是我得到了错误,我的目标是成功地对控制器中发生的http调用进行单元测试 我不熟悉单元测试。粘贴我的代码,请您帮助我,从现在起,我一直在努力。我也经历了许多解决方案,它们是如此不同,使我感到困惑。非常感谢您的帮助 服务代码:Javascript 无法对通过控制器发生的http调用进行单元测试,javascript,angularjs,unit-testing,karma-jasmine,Javascript,Angularjs,Unit Testing,Karma Jasmine,我正试图编写一个代码来测试在我的控制器中完成的服务调用。我试图在控制器中对特定功能进行单元测试,该功能正在执行服务调用并带来数据。目前我正在尝试使用本地json,但它实际上会执行一个服务调用 我知道首先我必须创建一个spy对象,但是我得到了错误,我的目标是成功地对控制器中发生的http调用进行单元测试 我不熟悉单元测试。粘贴我的代码,请您帮助我,从现在起,我一直在努力。我也经历了许多解决方案,它们是如此不同,使我感到困惑。非常感谢您的帮助 服务代码: //xlpApp is the mo
//xlpApp is the module name
xlpApp.factory('xlpServices', ['$rootScope', '$http', function($rootScope,
$http) {
var xlpServices = {};
xlpServices.getProgramData = function(){
return $http.get(scripts/services/data/unitTesting.json');
};
unitTesting.json代码:
{
"name":"unit testing"
}
控制器代码:
$scope.events = {
programData: function(){
xlpServices.getProgramData().then(function(response) {
if (response && response.data) {
$scope.testVariable= response.data.name;
}
});
},
selectSortingType : function(type) {
$scope.selectedSorting = type;
selectedFilter.sortingBy = $scope.selectedSorting;
}
}
$scope.events.programData();
单元测试代码:
describe('myProgramGpmCtrl', function() {
beforeEach(module('xlp'));
var $controller;
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('service call test', function() {
var xlpServices , myService , $q;
var $scope = {};
beforeEach(inject(function(xlpServices,_$q_){
xlpServices = xlpServices;
$q = _$q_;
var controller = $controller('myProgramGpmCtrl', { $scope: $scope });
myService = jasmine.createSpyObj('xlpServices',['getProgramData']);
}));
it('Service call test ', function() {
expect(myService.getProgramData).toHaveBeenCalled();
});
});
});
错误:
Expected spy xlpServices.getProgramData to have been called.
试一试
describe('service call test', function() {
var xlpServicesMock , myService , $q;
var $scope = {};
beforeEach(inject(function(xlpServices,_$q_){
xlpServicesMock = xlpServices;
$q = _$q_;
spyOn(xlpServicesMock ,'getProgramData').and.callFake(function() {
// we can return promise instead this custom object
return {
then: (callback, errorCallback) => {
callback('data to be passed to then callback');
/* `callback` function should be invoked when you wanted to test the service for success response with status code 200.
`errorCallback` function should be invoked with 500 status code when you wanted to test the api failure
Ex: callback({status: 200, data: <your data here>);
errorCallback({status: 500, data: <your error data>})
You can prepare the response to be passed as you wanted.
*/
}
};
});
var controller = $controller('myProgramGpmCtrl', { $scope: $scope, xlpServices: xlpServicesMock });
}));
it('Service call test ', function() {
$scope.events.programData();
expect(myService.getProgramData).toHaveBeenCalled();
});
});
description('service call test',function()){
var xlpServicesMock,myService,$q;
var$scope={};
每次之前(注入(函数(xlpServices,$q){
xlpServicesMock=xlpServices;
$q=$q;
spyOn(xlpServicesMock,'getProgramData')和.callFake(function(){
//我们可以返回承诺,而不是此自定义对象
返回{
然后:(回调,errorCallback)=>{
回调(“要传递给然后回调的数据”);
/*当您想要测试服务的成功响应(状态代码为200)时,应调用`callback`函数。
`当您想测试api故障时,应该使用500状态代码调用errorCallback`函数
例如:回调({状态:200,数据:);
errorCallback({状态:500,数据:})
您可以根据需要准备要传递的响应。
*/
}
};
});
var controller=$controller('myProgramGpmCtrl',{$scope:$scope,xlpServices:xlpServicesMock});
}));
它('服务调用测试',函数(){
$scope.events.programData();
expect(myService.getProgramData).toHaveBeenCalled();
});
});
网上有很好的资源。
检查并非常感谢您的帮助。它对我很有用。使用toHaveBeenCalled()函数后,您能告诉我如何检查服务响应是否为200。如果响应为500,我如何知道。更新回答谢谢您的帮助。