【问题标题】:What is the point of the underscores in Angular JS testing dependency injectionAngular JS测试依赖注入中的下划线有什么意义
【发布时间】:2014-02-27 14:42:56
【问题描述】:

我目前正在编写一个将 Angular JS 集成到 Rails 应用程序中的教程。

测试设置如下:

describe( 'Club functionality', function() {
  // mock Application to allow us to inject our own dependencies
  beforeEach(angular.mock.module('league'));

  // create the custom mocks on the root scope
  beforeEach(angular.mock.inject(function($rootScope, _$httpBackend_, $state){
    //create an empty scope
    scope = $rootScope.$new();

    // we're just declaring the httpBackend here, we're not setting up expectations or when's - they change on each test
    scope.httpBackend = _$httpBackend_;
    scope.$state = $state;
  }));

  afterEach(function() {
    scope.httpBackend.verifyNoOutstandingExpectation();
    scope.httpBackend.verifyNoOutstandingRequest();
  });
  ...

完成本教程的该部分并浏览一些 Angular 文档后,我仍然不清楚为什么在包含 $httpBackend 依赖项时使用下划线。为什么会被嘲笑成这样? scope.httpBackend = _$httpBackend_;

【问题讨论】:

标签: angularjs testing karma-runner


【解决方案1】:

这个比看起来更简单。

为方便起见,我们希望在我们的测试套件中引用我们的服务/范围,就像我们在应用程序中习惯的那样。所以我们需要将它们的引用保存在外部函数范围内。

首先我们需要注入它们,所以我们尝试这样做而不使用下划线,如下所示:

var $httpBackend;

beforeEach(angular.mock.inject(function( $httpBackend ){

问题是内部函数作用域变量$httpBackend遮蔽了外部函数作用域变量$httpBackend,所以我们不能沿着作用域链向上设置我们的引用。

要修复它,我们必须为内部和外部范围变量使用不同的名称。下划线只是 $injector 的一点帮助,可以轻松完成。

【讨论】:

    【解决方案2】:

    免责声明:我没有写这个答案。它是从here复制而来的。

    所以“秘密”的关键就在这里: https://github.com/angular/angular.js/blob/master/src/auto/injector.js#L57

    基本上$injector 将去除前导/尾随下划线时 检查函数的参数(以检索依赖项)。 这是一个有用的技巧,因为我们可以做$rootScope = _$rootScope_; 和 然后,稍后在测试中使用$rootScope。它看起来更好,因为 测试代码使用与控制器相同的变量。在 不知何故,领先$有助于记住那些被注入 变量。

    我们当然可以:rootScope = $rootScope; 但事实并非如此 很明显rootScope被注入了。

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多