这是为$http
嘲笑设置的吗?
出于某种原因,我收到了这个错误:
未捕获错误:意外请求:GET http://
describe('DataService tests',function(){
var errorUrl = "/ErrorReturningURL";
var successUrl = "/SuccessReturningURL";
beforeEach(angular.mock.module('app'));
beforeEach(angular.mock.inject(function ($httpBackend) {
$httpBackend.when('GET', successUrl).respond('all good!');
$httpBackend.when('GET', errorUrl).respond(404, '');
}));
it('should call the callbackError when http returns error', inject(function (DataService, $httpBackend) {
var successCallback = jasmine.createSpy();
var errorCallback = jasmine.createSpy();
$httpBackend.expectGET(errorUrl);
DataService.getData(errorUrl, successCallback, errorCallback);
$httpBackend.flush();
expect(errorCallback).toHaveBeenCalled();
}));
}
) ;
服务(简化的):
app.service('DataService', function ($http, $parse) {
this.getData = function (url, callbackSuccess, callbackError) {
$http.get(url).success( function (data) {
callbackSuccess( processedData );
}).error( function (error) {
callbackError(error);
});
};
});
答案 0 :(得分:2)
$http
?angular-mocks.js
文件中添加了karma.js.conf
。$httpBackend mock
具有同步API,但必须与异步应用程序集成。flush()
方法是异步应用程序和同步测试之间的连接链接。刷新HTTP请求
生产中使用的$ httpBackend始终以异步方式响应具有响应的请求。如果我们在单元测试中保留了这种行为,我们必须创建异步单元测试,这些测试很难编写,遵循和维护。同时测试模拟,不能同步响应,因为这会改变被测代码的执行。 因此,模拟$ httpBackend有一个flush()方法,它允许测试显式刷新挂起的请求,从而保留后端的异步api ,同时允许测试同步执行
flush()
以实际提出请求: $httpBackend.expectGET(errorUrl);
DataService.getData(errorUrl, successCallback, errorCallback);
$httpBackend.flush();
expect(errorCallback).toHaveBeenCalled();