19

angularJS $httpBackendの公式ガイドに従って、このテストを行いますが、Karma で次のエラーが表示されます。 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);

});

4

5 に答える 5

30

_$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');
});
于 2014-03-06T14:02:23.723 に答える
12

同じ問題が私にも起こりました。問題は、私がリクエストをしていなかったということではなく、私が行っていたリクエストが予想されたものと異なっていたためです。

たとえば、私はこの期待を定義しました:

mockBackend.expectGET("http://myapi.com/001").respond("RESULT");

そして、私はこの別の URL をリクエストしていました。

http://myapi.com/002

非常に紛らわしいエラーメッセージで、根本的な問題とは簡単には関係ありません。

于 2015-11-25T20:59:34.337 に答える
1

予想されるリクエストごとにレスポンスを定義するのを怠ったため、同じ問題が発生しました。応答がない場合、フラッシュするものは何もありません。また、http promise は決して解決または失敗しません。

于 2016-08-23T19:58:54.373 に答える
0

$httpajax 呼び出しで AngularJs サービスを使用していない可能性があります。

$httpBackend何かをフラッシュすることを期待していたところに偶然遭遇しましたが、エラーが発生しました:

エラー: 保留中のフラッシュ要求はありません!

そのため、長い調査の結果、ajax は jQuery ではなく jQuery で記述されていることがわかりました。$http

$httpしたがって、Ajax 呼び出しには service を使用するようにしてください。

于 2021-06-30T14:38:19.133 に答える