Какая точка подчеркивания в 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 был введен.