我有一个 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
并查看正在提供的文件。
接下来,在我的测试中,the$http
和$q
服务都被注入了。
var $http, $q;
beforeEach(module('chai'));
beforeEach(inject(function(_$http_, _$q_) {
$http = _$http_;
$q = _$q_;
}));
然后我尝试使用$http.get
. 最后,从返回$http.get
的 Promise 被整理并调用以$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。
接下来,我想知道自定义的 Promise 接口(.success
和.error
)是否$http
破坏了该$q.all
方法。但显然不是。
/base/static/assets/json/cards/admissions.json
最后,我尝试在所有测试开始时提出独立请求。
正如预期的那样,它返回一个承诺,但它永远不会被解决,因为没有响应被发回。我检查了网络工具以查看返回的内容,结果发现甚至一开始都没有发出请求。代码肯定会运行,但由于某种原因$http
实际上并没有发出请求。
我的倾向是,这与 Angular Mocks 拦截$http
对其自身$httpBackend
服务的请求有关。我该如何规避这个?