我目前正在开发一个将角度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_;
答案 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。