2013-08-28 44 views
1

我有依賴db數據的測試。我一直在用rspec描述塊之前的語句使用工廠來創建數據。哪裏可以播種我的測試數據?

我想將它們移到開始運行。在繼續使用工廠的同時,是否有這樣做的好方法?

回答

0

是的,有幾種方法可以解決這個問題。默認情況下,語法的RSpec

before do 
end 

相同

before :each do 
end 

這意味着塊之前內的代碼是EACH規格之前調用。

然而,還可以使用:

before :all do 
    #... 
end 

曾經運行包圍代碼中定義它的描述(或其別名上下文)塊。但是,您應該謹慎使用before :all,因爲這意味着您的測試將不再獨立運行,具體取決於您在before :all塊中定義的內容。

如果要編寫在整個套件之前運行一次的代碼,還可以在(:suite)和之後(:suite)之前的選項中指定spec_helper文件中的RSpec配置。

更常見的方法是使用名爲'let'的RSpec方法,它接受一個參數和一個塊。它看起來是這樣的:

設(:富){FactoryGirl.create:用戶}

簡而言之,該let方法創建一個方法別名foo,在返回返回塊(價值FactoryGirl.create :user上面的例子)。好處是(1)它緩存這個變量,所以這個塊只獲取一次,(2)它被延遲評估,因此只有在你的測試中調用foo後,它纔會運行並緩存塊中的值。重要的是要記住,有時這種懶惰的評估可能會在某些情況下導致意外的行爲。您可以使用let!來防止延遲加載。 let方法在任何before語句之前運行,因此您可以在before塊中使用由let定義的任何方法。

最後,有一個名爲FactoryGirl Seeds的項目,它允許您在spec_helper中定義只能運行一次的生成器。沒有太多的使用它,所以我不知道它有多可靠,但你可以在這裏找到更多的信息:

https://github.com/evrone/factory_girl-seeds

相關問題