【发布时间】:2015-11-03 13:39:09
【问题描述】:
我有一个负责加载 config.json 文件的 Angular 服务。我想在我的 run phase 中调用它,所以我在我的 $rootContext 中设置了该 json,因此,将来每个人都可以使用它。
基本上,这就是我所拥有的:
angular.module('app.core', []).run(function(CoreRun) {
CoreRun.run();
});
我的 CoreRun 服务在哪里:
angular.module('app.core').factory('CoreRun', CoreRun);
CoreRun.$inject = ['$rootScope', 'config'];
function CoreRun($rootScope, config) {
function run() {
config.load().then(function(response) {
$rootScope.config = response.data;
});
}
return {
run: run
};
}
这很好用,当我尝试 test 时问题就出现了。我想监视我的配置服务,所以它会返回一个虚假的承诺。但是,我无法做到这一点,因为在我的测试配置阶段,服务不可用,我无法注入 $q。
据我所知,我必须模拟我的配置服务的唯一机会是在配置阶段,因为它是由运行块调用的。
到目前为止,我发现的唯一方法是使用我非常不喜欢的 jQuery 生成 Promise。
beforeEach(module('app.core'));
var configSample;
beforeEach(module(function ($provide) {
config = jasmine.createSpyObj('config', [ 'load' ]);
config.load.and.callFake(function() {
configSample = { baseUrl: 'someurl' };
return jQuery.Deferred().resolve({data: configSample}).promise();
});
provide.value('config', config);
}));
it('Should load configuration using the correspond service', function() {
// assert
expect(config.load).toHaveBeenCalled();
expect($rootScope.config).toBe(configSample);
});
有没有办法做出更正确的解决方法?
编辑: 可能值得一提的是,这只是在对我的运行块进行单元测试时出现的问题。
【问题讨论】:
-
看起来相似但完全不同。您所指的是关于在真实模块的配置阶段注入 $q 。这是关于在单元测试的配置阶段将 $q 注入运行块中,因此您可以模拟它以便能够测试您的运行块。
标签: javascript angularjs unit-testing jasmine promise