何時間も $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;
});
};