2011-11-04 68 views
37

我想在使用beforeEach塊的coffeescript中編寫一個茉莉花測試。這會導致coffeescript變量範圍的問題。這裏是想我寫:如何在coffeescript的特定範圍中聲明一個變量?

describe 'PhoneDetailCtrl',() -> 
    beforeEach() -> 
    scope = angular.scope() 
    $browser = scope.$service('$browser') 

    it 'should fetch phone detail',() -> 
    scope.params = {phoneId:'xyz'} 
    $browser.xhr.expectGET('phones/xyz.json').respond({name:'phone xyz'}) 
    ctrl = scope.$new(PhoneDetailCtrl) 

    expect(ctrl.phone).toEqualData({}) 
    $browser.xhr.flush() 

    expect(ctrl.phone).toEqualData({name:'phone xyz'}) 

這是不行的,但是,因爲scope$browser將獲得在最裏面的範圍var聲明。也就是說,一旦在beforeEach,然後再在it塊。我可以強制通過初始化它們的權利範圍進行聲明的變量,但是這似乎很奇怪:

describe 'PhoneDetailCtrl',() -> 
    $browser = {} 
    scope = {} 
    beforeEach() -> 
    scope = angular.scope() 
    $browser = scope.$service('$browser') 

    it 'should fetch phone detail',() -> 
    scope.params = {phoneId:'xyz'} 
    ... 

這工作,但JavaScript的它編譯實際上是

describe('PhoneListCtrl', function() { 
    var $browser, ctrl, scope; 
    $browser = {}; 
    ctrl = {}; 
    scope = {}; 

所有我需要的是線路var $browser, ctrl, scope;。我可以用coffeescript寫得更簡潔嗎?

+2

我認爲把初始化器保持在頂端是很好的。 – 2011-11-04 06:29:29

回答

30

你正在做的是正確的方式。

這在CoffeeScript documentation中描述。我不會擔心它創建的JS。是的,如果你自己編寫它,這有點麻煩,但當你使用像CoffeeScript這樣的重寫器時,這是你必須忍受的事情之一。

但是,您可以選擇一些相當不錯的選項。

如果您願意,您可以將變量放在當前上下文中(這恰好是您的茉莉花.Spec對象,好奇,因此它是一個相對安全和適當的地方,把變量...只是不要覆蓋existing vars in the context):

describe 'PhoneDetailCtrl',() -> 
    beforeEach() -> 
    @scope = angular.scope() 
    @$browser = @scope.$service('$browser') 

it 'should fetch phone detail',() -> 
    @scope.params = {phoneId:'xyz'} 
    #... etc 

您還可以設置自己的變量,在其中存儲的東西

describe 'PhoneDetailCtrl',() -> 
    setup = {} 

    beforeEach() -> 
    setup.scope = angular.scope() 
    setup.$browser = setup.scope.$service('$browser') 

    it 'should fetch phone detail',() -> 
    setup.scope.params = {phoneId:'xyz'} 
    #... etc 
10

您的測試可以寫成如下所示:

describe "MyGame", -> 
    mygame = null 
    beforeEach inject (_MyGame_) -> 
     mygame = _MyGame_ 

    it "should have two players", -> 
     expect(mygame.opponents.length).toEqual 2 

更清晰的語法 - 無需將事物全局化。

+4

對於備用線,您也可以使用'a = b = c = d = null'。這些變量不會互相影響(而不是如果您將它們分配給'{}') – Fluffy

+0

您鏈接的死者。我不確定現在是/現在,還是建議進行修改。 – yochannah