Angularjs 如何在应用程序配置中初始化角度转换来测试控制器?
我有一个使用Angular Translate()的应用程序。Translate通过浏览器在应用程序中工作得很好,但当我尝试测试任何控制器时,我得到错误:意外请求:get locale/locale en.json。既然启动时对语言文件执行GET请求,那么如何对控制器进行单元测试 我用的是带业力的约曼角度发生器Angularjs 如何在应用程序配置中初始化角度转换来测试控制器?,angularjs,jasmine,gruntjs,yeoman,karma-runner,Angularjs,Jasmine,Gruntjs,Yeoman,Karma Runner,我有一个使用Angular Translate()的应用程序。Translate通过浏览器在应用程序中工作得很好,但当我尝试测试任何控制器时,我得到错误:意外请求:get locale/locale en.json。既然启动时对语言文件执行GET请求,那么如何对控制器进行单元测试 我用的是带业力的约曼角度发生器 App.js: angular.module('myApp', ['ngCookies', 'ui.bootstrap', 'pascalprecht.translate']) .
App.js:
angular.module('myApp', ['ngCookies', 'ui.bootstrap', 'pascalprecht.translate'])
.config(function ($routeProvider, $locationProvider, $translateProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
})
.otherwise({
redirectTo: '/'
});
$translateProvider.useStaticFilesLoader({
prefix: 'locale/locale-',
suffix: '.json'
});
$translateProvider.uses('en');
$translateProvider.useLocalStorage();
});
控制器测试:
describe('Controller: DocumentationCtrl', function () {
// load the controller's module
beforeEach(module('myApp'));
var DocumentationCtrl,
scope,
$httpBackend;
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope, $injector) {
$httpBackend = $injector.get('$httpBackend');
scope = $rootScope.$new();
DocumentationCtrl = $controller('DocumentationCtrl', {
$scope: scope
});
}));
it('should attach a list of awesomeThings to the scope', function () {
$httpBackend.whenGET('locale/locale-en.json').respond(200, {
"TITLE": 'My App'
});
expect(scope.awesomeThings.length).toBe(3);
});
});
文档控制器只是一个标准生成的控制器 避免初始化应用程序级模块,将控制器放在myApp.controllers中并测试此模块 “我们建议您将应用程序拆分为多个模块。(……)这种拆分的原因是,在测试中,经常需要忽略初始化代码,而初始化代码往往很难测试。”
我认为您的顺序是错误的:angular translate的设置试图在调用
uses(lang)
之后立即加载语言(实际上是在块之后)
在anguluar translate中开发适配器时,我们遇到了类似的问题。尝试查看url加载程序插件的测试
控制器是否应该在以后的一步中注入?您必须在配置阶段而不是运行阶段中指定首选语言。因此,
$translate.uses('us')
变成了$translateProvider.preferredLanguage('us')
。
这同样适用于useLocalStorage()
。这些都是配置$translate
服务的方法
您还应该尽量避免使用()设置默认语言。改用preferredLanguage()
。原因是,$translate.uses()
尝试尽快加载i18n文件,
如果有一个cookie或类似的cookie使用另一个语言键,
uses()
将加载两个文件,这就是为什么我们引入了preferredLanguage()
和yea,这应该可以解决问题。我确实尝试过,但这似乎仍然是一条可行之路,但对于意外的GET/locale/en-us.json,问题仍然是一样的。我也在想,不过我尝试过将expectGET/whenGET放在几个不同的位置。我想问题是你可能在逃避什么,这是一个鸡和蛋的问题。基本上,我需要在应用程序运行之前定义whenGET,但应用程序需要首先实例化。有没有关于如何做到这一点的例子?我需要先在我的测试中加载翻译,然后再加载我的应用程序吗?非常感谢你的回答。我仍然不知道如何测试它,尽管我确实切换到了preferredLanguage(),所以我的app.config看起来像:$translateProvider.UseStaticFileLoader({prefix:'locale/locale-',后缀:'.json'})$翻译提供者。首选语言(“美国”)$translateProvider.useLocalStorage();哦,发生错误是因为您不希望显式地收到http get请求。因此,在您的it()规范中,您应该执行如下操作:$http.expectGET('locale/locale us.json');不要忘记通过$http.flush()刷新挂起的响应;我让它工作了。修复方法是在我的单元测试中初始化应用程序之前使用preferredLanguage()并重写该函数。这是一个相当大的应用程序,我不想在每个单元测试中都使用区域设置expectGET。谢谢在内部覆盖$translateProvider.preferredLanguage()
时,不会设置任何语言,因为您也不再通过$translateProvider.uses()
设置语言。这意味着不会加载任何18n文件,并且不会触发“意外获取请求”错误。这同样意味着,你的测试并不能真正测试你想要测试的东西。老实说,您实际上不必测试angular translate的功能(通过检查i18n文件是否真的加载),因为这些测试是随angular translate本身一起进行的。@PascalPrecht您有什么建议?似乎(至少对于加载程序静态文件)对json文件的请求是在模块配置期间发出的,而模块配置是在运行任何单元测试之前。您建议如何模拟此http请求?