3

何時間も $httpBackend を使って NewPostController をテストしようとしてきました。問題は、応答に 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 throw」というメッセージで失敗します (コールスタックなし)。サブテストの順序を変更し、expectPOST の代わりに whenPOST を使用して、Angular ドキュメント ( https://docs.angularjs.org/api/ngMock/service/ $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;
  });
};
4

1 に答える 1

1

これは確かに奇妙であり、おそらくAngularチームが考慮していなかったことです.

プロミスがスローによって拒否されると (あなたが行っているように)、Angular $exceptionHandler サービスがスローされた例外で呼び出されます。デフォルトでは、このサービスはブラウザ コンソールに例外を記録するだけです。

ただし、ngMocks を使用する場合、このサービスは、例外をログに記録または再スローできるモック実装に置き換えられます。デフォルトのモードは、例外がスローされたときにテストを失敗させるために再スローすることです。

私のアドバイスは、単にプロミスを拒否するために throw を使用しないようにすることです。

function (res) {
  throw res.status;
}

function (res) {
  return $q.reject(res.status);
}

ただし、本当に throw を使い続けたい場合は、再スローの代わりにログに記録するようにモック exceptionHandler を構成することもできます。

beforeEach(module(function($exceptionHandlerProvider) {
  $exceptionHandlerProvider.mode('log');
}));
于 2015-05-10T09:12:55.423 に答える