【问题标题】:AngularJS Service Jasmine Unit Test Unflushed Request ErrorAngularJS 服务 Jasmine 单元测试未刷新请求错误
【发布时间】:2015-08-02 12:07:21
【问题描述】:

我正在编写我的第一个单元测试来检查 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 部分测试没有执行,但我找不到检查方法。谁能解释为什么我有一个未刷新的请求?另外,有什么方法可以让我逐步完成测试,或者至少将变量打印到屏幕上,这样我就可以弄清楚发生了什么?

提前致谢!

【问题讨论】:

  • 我知道$scope.$digest() 会刷新承诺,所以我会尝试:var res = RestService.getList(url); $scope.$digest(); res.then(...);。这样,您也可以 console.log 到 res 看看是否有效。
  • 我已经尝试过你的建议,但我仍然会遇到同样的错误。我在beforeEach 中注入了作用域,就像var root = $injector.get('$rootScope'); scope = root.$new(); 一样,然后更改了测试var res = RestService.getList(url); scope.$digest(); res.then(function() { httpBackend.flush(); expect(res.length).toEqual(2); });。希望我可以打印到代码正在执行的控制台吗?

标签: angularjs unit-testing jasmine gulp karma-jasmine


【解决方案1】:

httpBackend.flush 是函数,它导致从 httpBackend 返回数据。 你不能在 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

【讨论】:

  • 谢谢!这确实解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2013-08-29
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
相关资源
最近更新 更多