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 承诺永远不会解决或失败。

于 2016-08-23T19:58:54.373 回答
0

也许您没有$http在 ajax 调用中使用 AngularJs 服务。

我碰巧在我希望$httpBackend刷新一些东西的地方,但我得到了一个错误:

错误:没有待处理的刷新请求!

所以经过长时间的调查,我发现 ajax 是用 jQuery 而不是$http

因此,只需确保您使用$http服务进行 Ajax 调用。

于 2021-06-30T14:38:19.133 回答
0

我有同样的例外,因为我使用了 ngMockE2E 模块而不是 ngMock 模块。即使调用 $rootScope.$digest() 也无济于事。

于 2018-01-17T13:08:14.373 回答