【发布时间】:2014-10-05 19:13:05
【问题描述】:
我有一个服务,$language,它在应用配置中被调用(所以在每个 Spec 运行之前)。名为$language.update() 的方法会触发$translate.use()(进而触发$http.get())。这会导致Unexpected request: GET /<lang>/i18n。
我尝试了几种不同的方法来解决这个问题,但每一种方法似乎都会导致一个新问题:
全局模拟 $translate 服务
// not inside a describe()
beforeEach(function() {
module(function($provide) {
$provide.value('$translate', {
get: function() { return false; },
storage: function() { return false; },
storageKey: function() {
return {
get: function() { return false; },
set: function() { return false; }
};
},
use: function() { return false; }
});
});
});
但是有些东西试图调用$translate(),所以我尝试使模拟成为一个返回对象的函数,但这也不起作用。
通过 $httpBackend 模拟 GET 请求
// not inside a describe()
beforeEach(function() {
// this already existed to avoid another problem caused by $translate
module('MyApp', function config($translateProvider, $anotherProvider) {
// …
});
// new
inject(function($httpBackend) {
$httpBackend.when('GET', '/<lang>/i18n').respond({});
});
});
然后它抱怨Injector already created, can not register a module!(module 和 inject 的顺序似乎并不重要)。
我曾想过在全球范围内模拟我的 $language 服务,但我无法在它自己的规范中对其进行测试。
理想情况下,我更喜欢全局模拟 $translate,因为它似乎会导致一个接一个的问题。
【问题讨论】:
标签: angularjs unit-testing mocking jasmine angular-translate