angularJS $ httpBackend の公式ガイドに従って、私はこのテストを行いますが、Karmaはこれを提供しますerror:Error: No pending request to flush ! at Function.$httpBackend.flush
テスト
'use strict';
describe('profileCtrl', function () {
var scope, $httpBackend;
beforeEach(angular.mock.module('maap'));
beforeEach(angular.mock.inject(function($rootScope, $controller, _$httpBackend_){
$httpBackend = _$httpBackend_;
$httpBackend.when('GET', 'profile').respond([{id: 1, name: 'Bob'}]);
scope = $rootScope.$new();
$controller('profileCtrl', {$scope: scope});
}))
it('should fetch list of users', function(){
$httpBackend.flush();
expectGET(scope.current_user.length).toBe(1);
expect(scope.current_user[0].name).toBe('Bob');
});
});
この単純なコントローラーの場合:
'use strict';
angular.module('maap').controller('profileCtrl', function($scope, UserService) {
$scope.current_user = UserService.details(0);
});
_$httpBackend_
テストでhttpリクエストを行わないため、フラッシュするものはありません。
Httpリクエストを行うコードを呼び出す必要があります。
次に、何かがテストでhttpリクエストを作成したら、flush
メソッドを呼び出して、作成されたリクエストに対する応答を提供できます。
何かのようなもの:
it('should fetch list of users', function(){
// Do something that will make an http request
MyService.getAllUser(function ...) // for example
// Then provide a response for the http request that
// has been made when getAllUser was called
$httpBackend.flush();
// Check the expected result.
expect(something).toBe('Bob');
});
同じ問題が私にも起こりました。問題は、私がリクエストをしていないということではなく、リクエストが予期したものと異なっていたためです。
たとえば、私はこの期待を定義しました:
mockBackend.expectGET("http://myapi.com/001").respond("RESULT");
そして、私はこの他のURLを要求していました:
http://myapi.com/002
非常に紛らわしいエラーメッセージ、根本的な問題と簡単に関連するものはありません。
予想される各要求に対する応答を定義するのを怠っていたため、同じ問題が発生しました。応答がなければ、フラッシュするものは何もありません。また、httpプロミスは解決も失敗もしません。
NgMockモジュールの代わりにngMockE2Eモジュールを使用したため、同じ例外が発生しました。 $ rootScope。$ digest()を呼び出しても助けにはなりませんでした。