Angular / Karma - $ http.get未执行

时间:2015-05-27 11:27:26

标签: javascript angularjs karma-runner angular-mock karma-mocha

我有一个AngularJS项目,它使用Karma在浏览器中运行一些单元测试。我正在使用mocha作为测试框架。

但是,我有一些规范测试需要读取一些JSON文件并检查它们是否符合给定的约定规范(类型,名称约定等)。

我应该清楚说明这是我要测试的这些文件的实际内容。不是通过Angular Mock $httpBackend

的欺骗版本

我正在标记要在karma.conf.js中投放的JSON文件。

files: [
  { pattern: 'static/assets/json/cards/*.json', included: false, served: true },
  'path/to/angular.js',
  'path/to/angular-mocks.js',
  'tests/**/*.js'
]

如果我运行karma start,我可以浏览/base/static/assets/json/cards/something.json并查看正在投放的文件。

接下来,在我的测试中,$http$q服务都会被注入。

var $http, $q;

beforeEach(module('chai'));
beforeEach(inject(function(_$http_, _$q_) {
  $http = _$http_;
  $q = _$q_;
}));

然后我尝试使用$http.get加载每个资源。最后,对$http.get返回的承诺进行整理,并调用$q.all以便等待所有这些承诺完成,然后再致电done()并继续前进。

it('should load the resources', function(done) {
  var promises = ['admissions.json', 'discharge.json']
  .map(function(resource) {
    console.log('Loading', resource);
    return $http.get('/base/static/assets/json/cards/' + resource);
  });

  $q.all(promises)
  .then(function(card) {
    console.log('Success');
    done();
  }, function(err) {
    console.log('Failure', err);
    done();
  });
});

当我的测试运行时,我会看到以下控制台输出:

Loading admissions.json
Loading discharge.json
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

起初我认为加载时间可能超过了超时,但文件只有95kb。

接下来,我想知道.success的自定义承诺界面(.error$http)是否违反$q.all方法。但显然不是。

最后,我尝试在所有测试开始时为/base/static/assets/json/cards/admissions.json发出独立请求。

它按预期返回一个promise,但它永远不会被解析,因为没有回复响应。我检查了网络工具以查看返回的内容,结果发现该请求甚至不是首先发出的。代码肯定会运行,但由于某种原因,$http实际上并未发出请求。

我的倾向是,这与Angular Mocks拦截$http请求它自己的$httpBackend服务有关。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:0)

我在this blog找到了解决方案。问题是你必须添加范围的摘要,即使你没有测试控制器。

it('does a thing one way', function() {
    var value;
    deferred.promise.then(function(_value_) {
        value = _value_;
    });
    deferred.resolve(10);
    expect(value).not. toBe(10); // not yet 10 because $digest hasn't run
    $scope.$digest();
    expect(value).toBe(10); // 10 because $digest already ran
});