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

时间:2014-02-03 22:02:36

标签: angularjs testing 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();
  });
  ...

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

2 个答案:

答案 0 :(得分:13)

这个比看起来更简单。

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

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

var $httpBackend;

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

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

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

答案 1 :(得分:8)

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

  

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

     

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

     

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