Какая точка подчеркивания в Angular JS-тестировании зависимой инъекции

В настоящее время я работаю над учебником, объединяющим 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 - they change on each test
    scope.httpBackend = _$httpBackend_;
    scope.$state = $state;
  }));

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

После завершения этого раздела учебника и просмотра некоторых документов angular мне все еще не ясно, почему подчеркивания используются при включении зависимости $httpBackend. Почему это так насмехается? scope.httpBackend = _$httpBackend_;

Ответ 1

Это проще, чем выглядит.

Для удобства мы хотим ссылаться на наши сервисы/области применения нашего тестового набора, как мы привыкли в наших приложениях. Поэтому нам нужно сохранить их ссылку в области внешней функции.

Сначала нам нужно их вводить, поэтому мы стараемся сделать это без подчеркивания:

var $httpBackend;

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

Проблема заключается в том, что переменная области видимости внутренней области $httpBackend затеняет переменную области внешней функции $httpBackend, поэтому мы не можем перейти к цепочке областей видимости, чтобы установить нашу ссылку снаружи.

Чтобы исправить это, мы должны иметь разные имена для внутренних и внешних переменных сферы. Подчеркивания - это лишь небольшая помощь от инжектора $, чтобы сделать это без боли.

Ответ 2

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не написал этот ответ. Он был скопирован из здесь.

Итак, ключ к "тайне" здесь: https://github.com/angular/angular.js/blob/master/src/auto/injector.js#L57

В основном $injector будет удалять ведущие/завершающие символы подчеркивания, когда проверка аргументов функции (для получения зависимостей). Это полезный трюк, поскольку мы можем сделать $rootScope = _$rootScope_; и то позже в тестах используйте $rootScope. Это выглядит красивее с тех пор В тестовом коде используются те же переменные, что и контроллер. В как-то с ведущим $ помогает помнить, что те, которые вводятся переменные.

Конечно, мы могли бы сделать: rootScope = $rootScope;, но это было бы не так очевидно, что rootScope был введен.