【问题标题】:Angular $httpBackend how to mock an error response?Angular $httpBackend 如何模拟错误响应?
【发布时间】:2016-04-01 06:57:53
【问题描述】:

我正在尝试测试我的程序是否正确处理了我从 http 请求中获得的错误消息,但我不知道如何使用 $httpBackend 来模拟它。鉴于以下情况:

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

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

示例 API 响应:

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

【问题讨论】:

  • 我也有同样的问题。
  • 响应对象中没有error。发布您的代码并说明您要测试的内容。
  • httpBackend 响应对象中没有错误,但是我从正在使用的 API 获得的对象中有错误。这就是问题所在。
  • 那么,您的后端返回一个响应,其主体是一个带有状态数据和错误字段的对象?如果是这样,请确保您的代码中的 object 就是这样一个对象。
  • 你在object里放什么?

标签: angularjs unit-testing


【解决方案1】:

代码...

$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 将是对象。

【讨论】:

  • 也许我没有很好地表达我的问题,但这并没有回答它。问题是 $httpBackend 会将我传递的对象放在 errorResponse.data 中,当我需要它放在 errorResponse.error 中以模拟相关 API 时。
【解决方案2】:

$httpBackend 链上的respond 方法不提供自定义响应的方法。可以使用$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 = { ... };

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    相关资源
    最近更新 更多