Javascript 角度/业力-$http.get未执行

Javascript 角度/业力-$http.get未执行,javascript,angularjs,karma-runner,angular-mock,karma-mocha,Javascript,Angularjs,Karma Runner,Angular Mock,Karma Mocha,我有一个AngularJS项目,它使用Karma在浏览器中运行一些单元测试。我使用mocha作为测试框架 但是,我有一些规范测试需要读取一些JSON文件,并检查它们是否符合给定的约定规范(类型、名称约定等) 我应该明确指出,我要测试的是这些文件的实际内容。不是通过Angular Mock的$httpBackend伪造的版本 我正在标记JSON文件,以便在karma.conf.js中提供服务 files: [ { pattern: 'static/assets/json/cards/*.jso

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

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

我应该明确指出,我要测试的是这些文件的实际内容。不是通过Angular Mock的
$httpBackend
伪造的版本

我正在标记JSON文件,以便在
karma.conf.js
中提供服务

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

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

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

正如预期的那样,它返回一个承诺,但它永远不会得到解决,因为没有返回响应。我检查了网络工具,看看有什么东西回来了,结果发现请求根本就没有发出。代码肯定会运行,但由于某种原因,
$http
实际上没有发出请求

我的倾向是,这与Angular Mock拦截自己的
$httpBackend
服务的
$http
请求有关。我怎样才能避免这种情况呢?

我找到了一个解决方案。问题是,即使不测试控制器,也必须添加作用域摘要

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
});