Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在应用程序配置中初始化角度转换来测试控制器?_Angularjs_Jasmine_Gruntjs_Yeoman_Karma Runner - Fatal编程技术网

Angularjs 如何在应用程序配置中初始化角度转换来测试控制器?

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']) .

我有一个使用Angular Translate()的应用程序。Translate通过浏览器在应用程序中工作得很好,但当我尝试测试任何控制器时,我得到错误:意外请求:get locale/locale en.json。既然启动时对语言文件执行GET请求,那么如何对控制器进行单元测试

我用的是带业力的约曼角度发生器


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请求?