Angular JS测试依赖注入的下划线有什么意义

Dav*_*vey 11 testing angularjs karma-runner

我目前正在开发一个将角度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();
  });
  ...
Run Code Online (Sandbox Code Playgroud)

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

Ila*_*mer 13

这个比看起来更简单.

为方便起见,我们希望在我们的应用程序中使用我们的测试套件中的服务/范围.所以我们需要在外部函数范围保存它们的引用.

首先我们需要注入它们,所以我们尝试这样做而没有像这样的下划线:

var $httpBackend;

beforeEach(angular.mock.inject(function( $httpBackend ){
Run Code Online (Sandbox Code Playgroud)

问题是内部函数作用域变量会$httpBackend影响外部函数作用域变量$httpBackend,因此我们不能通过作用域链来设置我们的引用.

要修复它,我们必须为内部和外部范围变量指定不同的名称.下划线只是一点点的帮助从$美注射器做到没有痛苦.


mue*_*hdo 8

免责声明:我没有写这个答案.它是从这里复制的.

因此,"秘密"的关键在于:https: //github.com/angular/angular.js/blob/master/src/auto/injector.js#L57

$injector在检查函数的参数(检索依赖关系)时,基本上会删除前导/尾随下划线.这是有用的技巧,因为我们可以做 $rootScope = _$rootScope_;,然后,在测试后期使用$rootScope.它看起来更好看,因为测试代码使用与控制器使用的相同的变量.以某种方式有领先$有助于记住那些是注入变量.

当然我们可以做到:rootScope = $rootScope;但注入rootScope并不是那么明显.