Angularjs 带有模拟数据的Jasmine$HTTP请求
我试图测试$http请求,无论我做什么,我似乎都无法让它工作。我有一个工厂,拥有4个请求类型GET、POST、PUT、DELETE 我试图测试来自get请求的响应,但在控制器中分配给响应的范围变量给出了错误或undefined=来自get请求的响应 出厂代码如下:Angularjs 带有模拟数据的Jasmine$HTTP请求,angularjs,jasmine,karma-jasmine,Angularjs,Jasmine,Karma Jasmine,我试图测试$http请求,无论我做什么,我似乎都无法让它工作。我有一个工厂,拥有4个请求类型GET、POST、PUT、DELETE 我试图测试来自get请求的响应,但在控制器中分配给响应的范围变量给出了错误或undefined=来自get请求的响应 出厂代码如下: app.factory('requestService', ['$http', function ($http) { // reusable requests return { //reuable get request
app.factory('requestService', ['$http', function ($http) {
// reusable requests
return {
//reuable get request
getRequest: function (url) {
return $http({
method: 'GET',
dataType: "json",
url: url
});
},
//reuable post request
postRequest: function (url, data) {
return $http({
method: 'POST',
data: data,
url: url
});
},
//reuable put request
putRequest: function (url, data) {
return $http({
method: 'PUT',
data: data,
url: url
});
},
//reuable delete request
deleteRequest: function (url) {
return $http({
method: 'DELETE',
url: url
});
}
}
}]);
控制器中包含以下内容
//get the teams
$scope.getTeams = function(){
requestService.getRequest('https:.../teams').then(function (response) {
$scope.teams = response;
});
}
$scope.getTeams();
茉莉花代码:
describe('Controller Test', function() {
var $rootScope, controller;
//Tell the $httpBackend to respond with our mock object
var teamsResponse = {// Teams Data //};
beforeEach(function() {
module('myApp')
});
beforeEach(inject(function($rootScope, $controller, _$httpBackend_, $http) {
$scope = $rootScope.$new();
controller = $controller;
controller('Controller', {$scope: $scope});
$httpBackend = _$httpBackend_;
$httpBackend.whenGET('https:...../teams').respond(200, teamsResponse);
}));
it('should load a list of teams', function() {
$scope.getTeams();
$httpBackend.flush();
expect($scope.teams).toBe(teamsResponse);
});
});
我得到的错误是:
预期未定义为{//Teams Data//}
describe("Testing Common Get JSON Service", function () {
var service, $httpBackend;
beforeEach(inject(function($injector,$rootScope) {
service = $injector.get('CommonService');
$httpBackend = $injector.get('$httpBackend');
scope = $rootScope.$new();
successCallback = jasmine.createSpy();
errorCallback = jasmine.createSpy();
$httpBackend.when('GET', getFlightIncidentLookupUrl).respond(getFlightIncidentLookup);
successCallback();
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('test getServiceJSON works fine and calls a GET method', function () {
service.getServiceJSON(getFlightIncidentLookupUrl).then(function(response) {
expect(response.data.incidentLookup.length).toEqual(1);
});
$httpBackend.flush();
});
});
这对我有用。这里CommonService是Angular js中的一个服务,它调用get方法。我得到了正确的响应。您正在测试的代码在哪里?确切的错误是什么?”error or undefined=get请求的响应不够清晰。@estus编辑了问题内容。我现在不明白为什么它没有定义,甚至不确定考虑提供的数据是否可能,但问题是您正在进行功能/集成测试。正确的单元测试有两个方面。在控制器测试中,模拟requestService。在服务测试中,您模拟http请求。这样做的目的是逐行测试代码,并在有问题时将问题缩小到一行代码。此外,最好使用expect…respond in
it
,而不是在每次之前…respond in,请参阅关于严格与松散的备注。代码创建两个get请求:一个是在实例化控制器时,另一个是在it
块中。这是故意的吗?