2014-01-19 38 views
0

我從JS將一些摩卡測試的CoffeeScript並且具有與所述beforeEach功能的問題。以下是我目前擁有的,但data變量在測試用例中未被識別。有什麼建議麼?摩卡 - CoffeeScript的語法

beforeEach -> 
    data = 
    name: "test name" 
    to: "alice" 
    from: "bob" 
    object1: "foo" 
    object2: "bar" 

這裏是原:

beforeEach(function(){ 
    data = { 
    name: "test name", 
    to: "Alice", 
    from: "Bob", 
    object1: "foo", 
    object2: "bar" 
    } 
}); 
+0

您提供的CoffeeScript中是完全一樣的JS。你在哪裏使用'數據'? coffeescript將所有變量移動到最小範圍,如果你需要'beforeEach'之外的'data',你必須在外部聲明它。 – darthmaim

+0

@muistooshort我說,在我的第二個句子;) – darthmaim

+0

@darthmaim:我說的是「你所提供的CoffeeScript中是完全一樣的JS。」部分,也許我太過挑剔:) –

回答

1

在你的JavaScript版本:

beforeEach(function(){ 
    data = { ... } 
}); 

data是一個全局變量,因爲它沒有明確範圍的使用var data功能。在你的CoffeeScript版本:

beforeEach -> 
    data = ... 

databeforeEach回調函數內的局部變量,因爲這是how variables work in CoffeeScript

詞法作用域和變量安全

的CoffeeScript的編譯器負責進行確保所有 變量的正確詞法範圍內聲明的 - 你永遠需要 自己寫var

和你的CoffeeScript結束了這樣的JavaScript:

beforeEach(function(){ 
    var data = { ... } 
}); 

data被藏到了,你還看不出來。

一種解決方案是beforeEach外手動創建data

describe 'Whatever', -> 
    data = null 
    beforeEach -> 
    data = ... 

這會給你同樣的data內外beforeEachdata應該是你在裏面每個it S的期望是什麼。

另一種選擇是使用一個實例變量data

beforeEach -> 
    @data = ... 

,然後看看你的@datait的內線。

我寧願第一個版本(手動範圍datadata = null),因爲你永遠不知道什麼時候你會不小心覆蓋別人的實例變量。

+0

+1對變量範圍的詳細解釋 – Anconia