我有一个使用Angular Translate的应用程序(https://github.com/PascalPrecht/angular- translate)。Translate在浏览器中的应用程序中工作得很好,但是当我尝试测试任何控制器时,我得到 错误:意外的请求:GET locale / locale-en.json 。由于在启动时会翻译GET请求以获得语言文件,因此如何对控制器进行单元测试?
我在Karma中使用yeeoman角度发生器。
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); }); });
文档控制器只是一个标准生成的控制器。
您必须在配置阶段而不是运行阶段中指定首选语言。如此$translate.uses('us')成为$translateProvider.preferredLanguage('us')。同样适用useLocalStorage()。这些都是配置$translate服务的方法。
$translate.uses('us')
$translateProvider.preferredLanguage('us')
useLocalStorage()
$translate
您还应该尝试避免uses()设置默认语言。使用preferredLanguage()代替。原因是,$translate.uses() 尝试尽快加载i18n文件,如果存在使用其他语言密钥的cookie或类似uses()文件,则将加载两个文件,这就是我们引入的原因preferredLanguage(),是的,这应该可以解决问题。
uses()
preferredLanguage()
$translate.uses()