当前位置: 首页 > 面试题库 >

如何使用在App Config中初始化的Angular Translate测试控制器?

狄灵均
2023-03-14
问题内容

我有一个使用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服务的方法。

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



 类似资料:
  • 我正在从Spring Boot 1.5.21迁移到2.2.5,在此过程中也从Spring Boot云版本Edgware迁移。SR6到Hoxton。SR3。这一举动迫使我放弃了侦探自己的跟踪/跨度模型实现,并接受了勇敢的新模型。但是,我的控制器集成测试有问题。 我有一个名为Edge的微服务,其中有一个名为EdgeApplication的主类,我使用Spock作为测试框架。我的代码包括以下测试类: 之

  • 问题内容: 我想延迟控制器的初始化,直到从服务器收到必要的数据为止。 我找到了针对Angular1.0.1的解决方案:延迟AngularJS路由更改,直到加载模型以防止闪烁,但无法使其与Angular1.1.0一起使用 模板 ​ JavaScript http://jsfiddle.net/dTJ9N/1/ 问题答案: 由于$ http返回了promise,因此创建自己的deferred仅在htt

  • 问题内容: 如果您有一个控制器来操作Angular.js中的$ scope变量,是否有惯用的方法: 重置控制器的$ scope,然后 重新启动控制器初始化? 对于复杂的控制器,不必将每个变量都重置为其初始值将非常方便,特别是如果您真正想要的是对控制器和范围进行简单的重新初始化。通过再次导航到相同的URL 并没有帮助。 编辑:假设我不能使用任何黑客工具,因为这会违反Chrome打包应用中的CSP。

  • 我有一个例子,我有一个注释类,它创建一个bean并调用一些代码。我已经启用了急切的单例初始化,并且调用了bean工厂方法,即使在应用程序启动时它没有在任何地方使用。但是,对于测试,即时初始化不起作用,并且不创建bean: 应用程序: 配置 以及测试: 因此,在执行测试时,不会调用来自类的方法,即使启用了,并且它在应用程序正常启动时工作。 问题是:如何为micronaut测试启用热切的单例初始化?

  • 问题内容: 我有一个AngularJs应用程序,我想在其中一开始就加载消息和应用程序版本,并将它们保存在本地存储中,然后再在控制器中使用它们。我现在所拥有的是每个控制器中的服务调用(目前为三个): 我只想获取一次应用程序版本并将其存储在此处。我不必每次都检查版本,对(如果新版本中添加了新消息)? 我发现使用$routeProvider的建议,但我的应用程序不是SPA。所以我需要其他想法/建议。对你

  • 我想从我的控制器类中处理阶段事件(即隐藏)。所以我所要做的就是添加一个这样的侦听器: 但问题是初始化在该代码之后立即开始: 在此代码之前: 因此,getScene返回null。 我自己找到的唯一解决方法是将侦听器添加到,当它变得不为空时,我得到场景,将我最终检索阶段的侦听器处理添加到它的中。这一切都以将所需的侦听器设置为阶段事件而结束。 我觉得听众太多了。 这是解决我问题的唯一方法吗?