如何使用 $httpBackend 进行单元测试?
How to get unit test working with $httpBackend?
我刚刚开始了解单元测试和 angular 1.2。我正在使用 $httpBackend 服务来测试服务中的 $httpcall。此服务在我的控制器中调用:
var app = angular.module('myApp', []);
app.controller('MainCtrl', function ( someService) {
var vm = this;
vm.hasError = false;
//debugger;
someService.someAsyncCall()
.then(function (data) {
vm.hasError = false;
})
.catch(function (data) {
vm.hasError = true;
});
});
app.factory('someService', function ($http) {
return {
someAsyncCall: function () {
return $http.get("/data")
.success(function (data) {
//return true
})
.error(function () {
console.log('error');
//return false
});
}
};
});
我正在尝试编写端点错误时的测试:
beforeEach(function () {
someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']);
module('myApp');
inject(function ($rootScope, $controller, $q, _$timeout_,$httpBackend) {
$scope = $rootScope.$new();
someServiceMock.someAsyncCall.andReturn($q.when('weee'));
$timeout = _$timeout_;
controllerService = $controller;
httpMock = $httpBackend;
});
});
it("should set hasError=true with error request", function () {
httpMock.expectGET("/datajfds").respond(false);
ctrl = controllerService('MainCtrl', {someService: someServiceMock});
expect(ctrl.hasError).toBe(true);
});
这是错误:
MainCtrl 测试应为错误请求设置 hasError=true。
Expected false to be true.
Error: Expected false to be true.
at new jasmine.ExpectationResult (http://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.js:114:32)
at .toBe (http://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.js:1235:29)
at .<anonymous> (http://run.plnkr.co/Q77IyPb6agUqgR2U/specs.js:37:31)
基本上我想要 coverage/write 测试 someService.someAsyncCall() 何时会捕获错误。我如何编写此测试才能使 ctrl.hasError =true?
你做的事情有很多问题,我不明白你想用第三次测试做什么。你打的api是在服务里配置的
$http.get("/data")
查看此 plunker,这可能是您尝试进行的测试。一些问题:
您注入了很多不需要的东西
您的服务电话未返回任何信息。
您没有从服务调用中获取值
我刚刚开始了解单元测试和 angular 1.2。我正在使用 $httpBackend 服务来测试服务中的 $httpcall。此服务在我的控制器中调用:
var app = angular.module('myApp', []);
app.controller('MainCtrl', function ( someService) {
var vm = this;
vm.hasError = false;
//debugger;
someService.someAsyncCall()
.then(function (data) {
vm.hasError = false;
})
.catch(function (data) {
vm.hasError = true;
});
});
app.factory('someService', function ($http) {
return {
someAsyncCall: function () {
return $http.get("/data")
.success(function (data) {
//return true
})
.error(function () {
console.log('error');
//return false
});
}
};
});
我正在尝试编写端点错误时的测试:
beforeEach(function () {
someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']);
module('myApp');
inject(function ($rootScope, $controller, $q, _$timeout_,$httpBackend) {
$scope = $rootScope.$new();
someServiceMock.someAsyncCall.andReturn($q.when('weee'));
$timeout = _$timeout_;
controllerService = $controller;
httpMock = $httpBackend;
});
});
it("should set hasError=true with error request", function () {
httpMock.expectGET("/datajfds").respond(false);
ctrl = controllerService('MainCtrl', {someService: someServiceMock});
expect(ctrl.hasError).toBe(true);
});
这是错误:
MainCtrl 测试应为错误请求设置 hasError=true。
Expected false to be true.
Error: Expected false to be true.
at new jasmine.ExpectationResult (http://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.js:114:32)
at .toBe (http://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.js:1235:29)
at .<anonymous> (http://run.plnkr.co/Q77IyPb6agUqgR2U/specs.js:37:31)
基本上我想要 coverage/write 测试 someService.someAsyncCall() 何时会捕获错误。我如何编写此测试才能使 ctrl.hasError =true?
你做的事情有很多问题,我不明白你想用第三次测试做什么。你打的api是在服务里配置的
$http.get("/data")
查看此 plunker,这可能是您尝试进行的测试。一些问题:
您注入了很多不需要的东西
您的服务电话未返回任何信息。
您没有从服务调用中获取值