6

I have an app that uses Angular Translate (https://github.com/PascalPrecht/angular-translate). Translate works great in the application via browser but when I try to test any controller I get Error: Unexpected request: GET locale/locale-en.json. How do I unit test my controllers since translate does a GET request for the language file on startup?

I am using the yeoman angular generator with Karma.


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();
  });

Controller Test:

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);
  });

});

The Documentation Controller is just a standard generated controller.

4

3 回答 3

5

您必须在配置阶段而不是运行阶段指定首选语言。就这样$translate.uses('us')变成了$translateProvider.preferredLanguage('us')。也一样useLocalStorage()。这些都是配置$translate服务的方法。

您还应该尽量避免uses()设置默认语言。改为使用preferredLanguage()。这样做的原因是,它会$translate.uses() 尝试尽快加载 i18n 文件,如果有使用其他语言密钥的 cookie 或类似文件,uses()将加载两个文件,这就是我们引入的原因preferredLanguage(),是的,这应该可以解决问题。

于 2013-07-09T13:54:36.237 回答
1

避免初始化应用程序级模块,将你的控制器放在 myApp.controllers 中并测试这个模块。

“我们建议您将应用程序分解为多个模块。(...)这种分解的原因是,在您的测试中,通常需要忽略初始化代码,这往往难以测试。”

http://docs.angularjs.org/guide/module

于 2013-07-04T21:13:38.240 回答
0

我认为您的顺序错误: angular-translate 的设置尝试在调用uses(lang)后立即加载语言(实际上是在块之后)。

在使用 anguluar-translate 开发适配器时,我们遇到了类似的问题。尝试查看https://github.com/PascalPrecht/angular-translate-loader-url/blob/16e559030bce819e8ca1b82fed7163286b57bafe/test/unit/translateUrlLoaderSpec.js这是 url 加载器插件的测试。

控制器不应该稍后注入吗?

于 2013-07-09T13:53:21.197 回答