Angular $ httpBackend如何模拟错误响应?

时间:2016-03-30 16:24:32

标签: angularjs unit-testing

我正在尝试测试我的程序正确处理我从http请求中获得的错误消息,但我无法弄清楚如何使用$ httpBackend来模拟它。鉴于以下内容:

$httpBackend.expectGET(path).respond(400, object);

400设置response.status,对象设置response.data,但是如何设置response.error?我需要测试的数据不在数据字段中。

API响应示例:

{
    status: 400,
    data: {},
    error: {}
}

2 个答案:

答案 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 = { ... };