私は$q.when()
でラップしたES6の約束を返す関数で作られたJSONP GETリクエストへの応答を模擬しようとしています。しかし、単体テストでは、リクエストは$ httpBackendによってキャッチされず、実際のURLに移動します。したがって、flush()
が呼び出されると、Error: No pending request to flush !
というエラーが表示されます。 JSONPのリクエストは、jQueryの$.getJSON()
でES6の約束の中で行われたので、ハードコードされたURLの代わりに正規表現を提供することで、すべての発信リクエストをキャッチすることにしました。
私はこれまで何度もこのことを理解しようとしてきましたが、まだ何が起こっているのかまだ分かりません。あたかもES6の約束のHTTPリクエストが "Angularの外"で行われているように、$ httpBackendはそれを知りません/それを捕まえることはできませんが、そうではないかもしれませんget-goからの$ q約束の中で。誰もが、なぜこの呼び出しが行われているのか、なぜ単純なタイムアウトがうまくいくのか教えていただけますか? $scope.$apply
,$scope.$digest
、$httpBackend.flush()
の組み合わせを試してみましたが、役に立たなくなりました。
たぶん、いくつかのコードは、これはしかし、作品何らかの理由で、より良い...
コントローラ
function homeController() {
...
var self = this;
self.getData = function getData() {
$q.when(user.getUserInformation()).then(function() {
self.username = user.username;
});
};
}
ユニットテスト
...
beforeEach(module('home'));
describe('Controller', function() {
var $httpBackend, scope, ctrl;
beforeEach(inject(function(_$httpBackend_, $rootScope, $componentController) {
$httpBackend = _$httpBackend_;
scope = $rootScope.$new(); // used to try and call $digest or $apply
// have also tried whenGET, when('GET', ..), etc...
$httpBackend.whenJSONP(/.*/)
.respond([
{
"user_information": {
"username": "TestUser",
}
}
]);
ctrl = $componentController("home");
}));
it("should add the username to the controller", function() {
ctrl.getData(); // make HTTP request
$httpBackend.flush(); // Error: No pending request to flush !
expect(ctrl.username).toBe("TestUser");
});
});
...
説明します:
グラハムさんのコメントにの
httpBackendあなたが作るために$ HTTPサービスを使用していない場合は、ユニットテストのために、角度によって$ HTTPサービスに注入されたモック実装ですリクエストでは、httpBackendを使用してキャッチすることはできません –