我正在尝试测试我的程序正确处理我从http请求中获得的错误消息,但我无法弄清楚如何使用$ httpBackend来模拟它。鉴于以下内容:
$httpBackend.expectGET(path).respond(400, object);
400设置response.status,对象设置response.data,但是如何设置response.error?我需要测试的数据不在数据字段中。
API响应示例:
{
status: 400,
data: {},
error: {}
}
答案 0 :(得分:4)
代码......
$httpBackend.expectGET(path).respond(400, object);
当代码向“路径”提出请求时,会说。端点,使用响应'对象'
回复400状态代码所以,例如,假设您的单元测试在您的应用中点击此代码...
$http.GET(path).then(function(response) {
// this code is hit with 2xx responses
vm.fred = 'hello';
}).catch(function(errorResponse) {
// this code is hit with any status code not starting with 2! e.g. 400
vm.fred='failed';
});
因此,您的代码将导致执行catch块。但是,在单元测试中,要强制执行catch块,您需要执行...
$rootScope.$digest();
这将触发then或catch块的执行(以相关的为准)。
然后,您可以像往常一样在单元测试中做出期望。请注意,在您的示例中,errorResponse将是object。答案 1 :(得分:0)
respond
链上的 $httpBackend
方法不提供自定义响应的方法。它可以使用$http
拦截器进行自定义。为每个响应指定错误的最简单方法是使用全局:
var responseError;
beforeEach(module('app', ($httpProvider) => {
function responseErrorInterceptor($q) {
return {
responseError: (response) => {
response.error = responseError;
return $q.reject(response);
}
};
}
$httpProvider.interceptors.push(responseErrorInterceptor);
}));
...
responseError = { ... };