2014-02-24 64 views
3

我經歷教程步驟5中的AngularJS,並在試驗段跨越這個片段來了:服務使用下劃線爲AngularJS測試

describe('PhoneCat controllers', function() { 

    describe('PhoneListCtrl', function(){ 
    var scope, ctrl, $httpBackend; 

    // Load our app module definition before each test. 
    beforeEach(module('phonecatApp')); 

    // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_). 
    // This allows us to inject a service but then attach it to a variable 
    // with the same name as the service. 
    beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) { 
    $httpBackend = _$httpBackend_; 
    $httpBackend.expectGET('phones/phones.json'). 
    respond([{name: 'Nexus S'}, {name: 'Motorola DROID'}]); 

    scope = $rootScope.$new(); 
    ctrl = $controller('PhoneListCtrl', {$scope: scope}); 
})); 

我不完全理解下劃線的目的當注射$httpBackend。我看到評論並理解代碼正在做什麼。我只是不明白爲什麼我們只用$httpBackend來做這件事。

我們注入的其他兩個服務與它一起,不需要這樣注入。我們如何通過以環形方式注入$httpBackend然後立即將它分配給一個同名的變量來幫助自己,我們不能直接注入它嗎?

+0

謝謝,我也讀了反應,但它給我的印象只是一個解釋改寫代碼中的註釋(這說明它在做什麼,而不是我們爲什麼要這麼做)。我的問題是,我們通過傳入下劃線獲得了什麼優勢,然後立即將它分配給一個相同名稱的變量,而不是直接注入(不帶下劃線)。 –

+0

因爲使用這種技術,注入'inject'函數的'$ httpBackend'在外部範圍('describe'scope)中變得可用。 – asgoth

回答

2

因爲這樣你可以在你的描述中聲明$ httpBackend,在beforeEach中將注入的服務分配給它,並在你的it塊中使用它。

例如:

describe('PhoneCat controllers', function() { 
    var $httpBackend; // variable declaration 

    beforeEach(inject(function(_$httpBackend_) { 
     $httpBackend = _$httpBackend_; // assignment 
    })); 

    it('should do something', function(){ 
     // usage 
     $httpBackend.expectGET('/myurl').respond(function(){ 
      // some behaviour 
     }); 
     // some assertion 
    }); 
}); 
+0

好吧,所以它只是爲了讓你在整個描述塊中訪問它,對吧?如果我們直接注入它而不是使用上面的格式,它會在beforeEach中丟失? –

+0

是的,或者你將不得不將它分配給一個不同名稱的變量,它可以很好地工作,但可能看起來很奇怪。基本上你可以用幾種方法達到同樣的效果。另一個是:beforeEach(inject(function($ injector)){httpBackend = $ injector.get('$ httpBackend'); }));' – kamilkp

1

正如你現在必須知道,角$注射器簡單地忽略那些下劃線,所以對於注射目的$ httpBackend和$ httpBackend是相同的。目前的實現只是取代那些下劃線。

唯一的「好處」是,如果你使用下劃線在您的參數,爲實例,$ httpBackend您可以自由使用名爲$ httpBackend全球測試變量,否則你必須給你的變量的其他名稱

var $httpBackend; 

beforeEach(inject(function(_$httpBackend_) { 
    $httpBackend = _$httpBackend_; 
}));