使用$ q和angular-extended-promise进行角度服务测试超时

时间:2016-09-17 17:26:21

标签: javascript angularjs unit-testing angular-promise

我正在使用角度扩展承诺作为其依赖项之一来测试角度服务。它看起来像这样:

angular.module('main')
    .service('MyService', ['_', '$q', 'DatabaseService', 
    function(_, $q, DatabaseService) {

      function loadResources(resources) {
          var resources = _.mapValues(resources, function(config, type) {
           return DatabaseService.getByType(type)
              .then(function(data) {
                  return index(type, data);
              });
          });
          return $q.props(resources);
      });

      var service = {
            loadResources: loadResources
      };

      return service;
    }
  ])
;

我想对loadResources函数进行测试,对于这个我的存根DatabaseService.getByType函数。我正在使用摩卡,柴,sinon在业力上运行。我的测试看起来像这样:

describe('[Service] MyService', function() {
    var MyService, DatabaseService, $q;
    var databaseBrand = [...]; // My fixtures

    beforeEach(function() {
        module('myApp');

        inject(function($injector) {
            MyService = $injector.get('MyService');
            DatabaseService = $injector.get('DatabaseService');
            $q = $injector.get('$q');

            sinon.stub(DatabaseService, 'getByType', function(type) {
                var typeResources = databaseBrand.filter(function(resource) {
                    return resource.type === type;
                });
                return $q.resolve(typeResources);
            });
        });
    });

    afterEach(function() {
        DatabaseService.getByType.restore();
    });

    it('loadResources method', function() {
        var configTest = { resources: [...] }; // input test data

        var promise = MyService.loadResources(configTest);
        return promise.should.be.fulfilled
            .then(function(brandResources) {
                console.log('PROMISE RESOLVED');
                expect(brandResources).to.be.an('object');
                // Other expects
            })
        ;
    });
});

当我运行测试时,我有这个超时:

PhantomJS 2.1.1 (Mac OS X 0.0.0) [Service] MyService loadResources method FAILED
    timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

当人们建议使用rootScope的。$ apply()或$ digest()来“强制”解析承诺时,我已经看过一些帖子。但问题是我正在测试一项服务,并且我希望将其隔离以进行测试而不需要任何其他有线行为。

我已经修改了在beforeEach期间恢复$ rootScope并在afterEach中强制$ digest并显示我在测试中添加的日志(什么是酷)但是我有一些错误,试图请求一些未包含在我的场景中的资源......

  

PhantomJS 2.1.1(Mac OS X 0.0.0)[服务] MyService“之后   每个“hook for”loadResources方法“FAILED意外请求:GET   / api / config不再需要请求     $httpBackend@bower_components/angular-mocks/angular-mocks.js:1211:90     sendReq@bower_components/angular/angular.js:10333:21     serverRequest@bower_components/angular/angular.js:10045:23 [native   代码] processQueue@bower_components/angular/angular.js:14567:30     bower_components /角度/ angular.js:14583:39     $eval@bower_components/angular/angular.js:15846:28     $digest@bower_components/angular/angular.js:15657:36     $apply@bower_components/angular/angular.js:15951:31

有没有办法避免使用这个$ digest或$ apply?如果我在服务中而不是控制器,为什么我必须这样做以允许$ q.prop解决这个承诺?

由于

0 个答案:

没有答案