这个问题不是要包含测试服务或提供替换服务的模拟。
情况:
我想测试的工厂是解析一组属性并通过getter函数提供这些信息。下面的伪代码描述了现在正在发生的事情(假设它有效,尽管根据数据长度创建动态测试非常麻烦。)
...
describe('fancyTest', function() {
// 1
beforeEach(function() {
// 7
module('app');
inject(function($injector) {
// 8
Factory = $injector.get('app.ToTestFactory');
UtilService = $injector.get('app.Util'); // bad, as to late...
});
});
// 2
describe('dataTest', function() {
// 3
// Goal: data = UtilService.getData('dataset1');
data = [{id:'test1'}, {id:'test2'}];
for (i = 0, l = data.length; i < l; i += 1) {
test(data[i]);
}
function test(properties) {
// 4
describe('datatest #' + i, function() {
var elem;
// 5
beforeEach(function() {
// 9
elem = new Factory(properties)
});
// 6
it('should provide the correct id', function() {
// 10
expect(elem.id()).toBe(properties.id);
});
...
});
}
}
...
}
UtilService.getData()是一个简单的方法,它从一些仅在执行测试时注入的常量中读取数据。它可能很重要,我不想异步加载它们。
问题:
Jasmine框架具有非常无意义的工作流程,首先运行并初始化所有describe块,然后再运行beforeEach。订单写在评论中。
在数据循环运行之前,我是否没有机会注入UtilService?
感谢您帮助我!
答案 0 :(得分:1)
如果您的UtilService是工厂,您可以使用每个
之前的服务将服务注入每个测试beforeEach(function() {
module('app');
var UtilService;
inject(function(_UtilService_) {
UtilService = _UtilService_;
});
});
jasmine设置测试的方式,只要你在Karma Config中正确加载所有依赖项,就不应该使用$ injector来提供服务。
由于下划线可能有点令人困惑,因此angular会提供强调服务,因此您每次都可以创建一个新实例。