2014-04-13 19 views

回答

0

使用before(:each)before(:all)的「經典」的方式是

describe "tests" do 
    before :each do 
    @var1='a' 
    @var2='b' 
    end 
end 

然後,通過與測試內部的@跡象前述他們,即

describe "tests" do 
    before :each do 
    @var1='a' 
    @var2='b' 
    end 
    it "does stuff" do 
    a=some_class.some_method(@var1) 
    expect(a).to eq @var2 
    end 
end 

如果你指的是實例變量希望每個測試中的變量都具有相同的值,您可以使用before :all
如果您希望變量具有爲每個測試生成的相同值before :each
一般使用before :each由於使用不當before :all太容易導致間歇性測試失敗。
before :all視爲定義常量。

let/let!格式如下:

describe "tests" do 
    let(:var1) {'a'} 
    let!(:var2) {srand(25)} 
    it "does stuff" do 
    a=some_class.some_method(var1) 
    expect(a).to eq var2 
    end 
end 

注意幾件事情:

  1. var1var2現在看起來像局部變量的@var1var1而不是在使用時測試和設置。實際上他們是測試類方法。使用時需要注意的重要一點是,您在使用NOT時使用了@符號,與之前的:eachbefore :all不同,您在哪裏使用過。
  2. let的示例的第一種情況下,letvar1一起使用。這允許跨示例的記憶工作。在第二種情況下,let!var2一起使用。這是需要的,因爲您希望在每次使用之前明確調用/設置變量(方法)。 srand()是一個很好的例子,當你需要這個,因爲它種下隨機數發生器,但僅用於rand()的下一次使用,所以如果在多個測試示例中使用它,每次都需要重置它。
+1

只需加我兩分錢。我寧願將':each'從我以前的''before'語句中移出。它看起來更乾淨。然後加上':all'就有可能在'before(:all)'塊之前創建。另一個有趣的發現是,你可以模仿'subject'行中的'let'範式,本質上是命名空間嵌套的主題'subject(:call_some_method){some_class.some_method(var1)}',那麼'it'塊就是一行代碼,讀得很好。 –

+0

每次都會對'let'和'let!'進行重新評估,所以每次您的隨機數都會有所不同,而不管您使用哪一個。不同之處在於它們被初始化。 'let!'在所有例子之前初始化 - 即使不使用它的例子。一個例子第一次使用它,「let」被初始化。 – Trejkaz