AngularJS Service Jasmine 单元测试未刷新请求错误

AngularJS Service Jasmine Unit Test Unflushed Request Error

我正在编写我的第一个单元测试来检查 AngularJS 服务的功能。这是我正在测试的具有 getList 功能的服务的一部分:

(function() {
'use strict';

angular
    .module('app.services')
    .factory('RestService', RestService);

    RestService.$inject = [ '$http' ];

    function RestService($http) { 

        var service = {
            getList: getList,
            ...
        };
        return service;

        function getList(url) {
            return $http.get(url)
            .then(function(response) {
                console.log('RestService: got list: ' + response.data.length);
                return response.data;
            })
            .catch(function(errResponse) {
                console.error('RestService: error getting list: ' + errResponse.status);       
            });
        }

并且我编写了以下单元测试:

'use strict';

describe('Test Rest Service', function() {

var httpBackend;
var RestService;
var reqHandler;

beforeEach(module('app.services'));

beforeEach(inject(function ($httpBackend, _RestService_) {
    httpBackend = $httpBackend;
    RestService = _RestService_;
    reqHandler = httpBackend.when('GET', '/api/events')
                    .respond(200, '[{ "event": 1 }, { "event": 2 }]');
}));

afterEach(function() {
    httpBackend.verifyNoOutstandingExpectation();
    httpBackend.verifyNoOutstandingRequest();
});

it('should get a list of events', function() {

    var url = '/api/events';
    httpBackend.expectGET(url);
    RestService.getList(url).then(function(response) {
        httpBackend.flush();
        expect(response.length).toEqual(2);
    });
});
});

当我 运行 测试时,我得到以下错误:

Test Rest Service
PhantomJS 1.9.8 (Windows 8 0.0.0) Test Rest Service "after each" hook FAILED
    Error: Unflushed requests: 1

我的第一个猜测是 then 部分测试没有执行,但我找不到检查它的方法。谁能解释为什么我有一个未完成的请求?另外,有什么方法可以逐步完成测试,或者至少将变量打印到屏幕上,这样我就可以弄清楚发生了什么?

提前致谢!

httpBackend.flush 是函数,它导致来自 httpBackend 的 return 数据。 你不能在 then 块中调用它,因为 then 在接收到数据时被调用(在这种情况下永远不会)。

正确的测试代码是

it('should get a list of events', function() {

  var url = '/api/events';
  httpBackend.expectGET(url);
  RestService.getList(url).then(function(response) {
    expect(response.length).toEqual(2);
  });

  httpBackend.flush();

});

工作示例 - http://plnkr.co/edit/TA1HdQJaZHuShJiIIw6V?p=preview