我經常看到它採用模擬在Rspec的代碼,就像這樣:爲什麼人們不能在Rspec中訪問數據庫?
describe "GET show" do
it "should find and assign @question" do
question = Question.new
Question.should_receive(:find).with("123").and_return(question)
get :show, :id => 123
assigns[:question].should == question
end
end
但他們爲什麼不通過get
與ID數據庫=> 123添加Question
,檢索,並摧毀它?這是最佳做法嗎?如果我不遵守規則,會發生什麼壞事?
我可以這樣說:如果我**必須在測試中訪問數據庫(例如,我無法在沒有數據庫中的某些文章的情況下測試關鍵字搜索功能),它應該是一個集成測試? –
我會說,如果爲了測試某個特定的東西,你真的需要別的東西而不是你的代碼和測試套件(包括mock等),那麼測試實際上也在測試其他東西,所以這是一個集成測試。然而,確定什麼是應用程序的「正確」部分以及什麼不是,並且總是不可能僅僅基於mock編寫測試。在這些情況下,將這些測試放在一個不會「默認」運行的獨立套件中是一種好的做法。 –