Angularjs 使用$httpBackend进行角度测试失败,返回“0”;“400扔”;错误

Angularjs 使用$httpBackend进行角度测试失败,返回“0”;“400扔”;错误,angularjs,karma-runner,karma-jasmine,httpbackend,Angularjs,Karma Runner,Karma Jasmine,Httpbackend,几个小时以来,我一直试图用$httpBackend测试我的新PostController。问题是,每当我在响应中设置非2xx状态代码时,测试就会失败 NewPostController具有以下方法: $scope.submit = function () { var newPost = $scope.newPost; PostService.insertPost(newPost).then(function (post) { $location.path("/my-pos

几个小时以来,我一直试图用$httpBackend测试我的新PostController。问题是,每当我在响应中设置非2xx状态代码时,测试就会失败

NewPostController具有以下方法:

$scope.submit = function () {
  var newPost = $scope.newPost;
    PostService.insertPost(newPost).then(function (post) {
      $location.path("/my-posts");
    }, function (status) {
        $scope.form.$setPristine();
        $scope.error = status;
    });
};
我在测试故障路径时遇到问题:

it(...) {
  ...
  $scope.post.text = "";
  $httpBackend.expectPOST("/create-post", {"post":$scope.post}).respond(400);
  $scope.submit();
  $httpBackend.flush();
  expect($scope.error).toBeDefined();

  $scope.post.text = "This is a valid text.";
  $httpBackend.expectPOST("/create-post", {"post": $scope.post}).respond(200);
  $scope.submit();
  $httpBackend.flush();
  expect($location.path()).toBe("/my-posts");
});
测试失败,并显示一条消息“400抛出”(无调用堆栈)。我试图改变子测试的顺序,使用whenPOST而不是expectPOST,并像Angular docs($httpBackend)中那样组合这些方法,但没有成功

请帮忙

编辑:

现在,当我看PostService时,“400抛出”从何而来是有道理的,但我希望错误会由angular处理。我抛出它是因为的“处理嵌套服务调用中的问题”一节。它应该是deferred.resolve/reject机制的较短版本

this.insertPost = function (newPost) {
  return $http({
    method: "post",
    url: "/create-post",
    data: {
      post: newPost
    }
  }).then(function (res) {
      return (res.data);
  }, function (res) {
      throw res.status;
  });
};

<>这确实很奇怪,也许是角度团队没有考虑到的。

当一个承诺被抛出拒绝时(正如您正在做的),angular被调用,抛出异常。默认情况下,此服务仅在浏览器控制台中记录异常

但是,当使用ngmock时,它被一个可以记录或重试异常的mock实现所取代。默认模式是重试,以便在抛出异常时使测试失败

我的建议是避免使用throw来简单地拒绝一个承诺,从而取代它

function (res) {
  throw res.status;
}

但是,如果您确实想继续使用throw,还可以将mock exceptionHandler配置为日志,而不是重试:

beforeEach(module(function($exceptionHandlerProvider) {
  $exceptionHandlerProvider.mode('log');
}));

发布业力的完整输出。并张贴邮政编码。非常感谢!我尝试了两种解决方案,它们都有效。您是否更倾向于使用$q.reject?我没有偏好,是的。我觉得应该使用throw来表示错误(bug),而不是预期的情况。它不能很好地处理单元测试这一事实也表明应该使用$q.reject()。我还担心将exceptionHandler配置为日志可能会使您的测试变得脆弱,并可能在不应该的情况下成功。再次感谢:)
beforeEach(module(function($exceptionHandlerProvider) {
  $exceptionHandlerProvider.mode('log');
}));