2012-05-22 48 views
1

我試圖去掌握在Rails中的測試。如何在所有測試中禁用after_validation方法

在我的一個模型中,我有after_validation :grab_external_stuffgrab_external_stuff是一種調用外部API的方法。我不想在我的測試中運行這個。

什麼是在我的測試中禁用這種after_validation方法的正確方法?我該怎麼做(使用rspec)?我在哪裏做?

我知道存根可以用來停止被調用的方法。但我很努力地看到如何將它應用於after_validation或類似的鉤子。

例如,假設我有一個屬於某個項目的屬於某個用戶的任務。我運行一個工廠(:任務),它也在創建相關的項目和用戶。但是當用戶被驗證時,grab_external_stuff被調用。

那麼在我的測試中,我應該指定我不想運行此方法?在測試中,在工廠,別的地方?

感謝您的任何建議。

回答

3

grab_external_stuff其實是一種方法嗎?也許在模塊中定義,或者在你的模型中定義爲類方法?如果是這樣的話,你是一定的,你永遠不希望它運行,您可以存根出來像你說:

before(:suite) do 
    Model.any_instance.stub(:grab_external_stuff) { nil } # if it's an instance method 
    # or: 
    # Model.stub(:grab_external_stuff) { nil } if it's a class method, etc 
end 

您可以設置在你spec_helper,或每個測試等

這個方法被after_validation塊調用的事實是無關緊要的,因爲它只是一種方法,可以像任何其他方式一樣被樁起來。

編輯即使由於您在工廠中製作某些東西而進行此驗證,它仍會被刪除。您將在工廠中創建一個測試,但before將爲before(:suite),:all:each,但無論如何,它將在甚至遇到it {}之前運行並調用stubbing,因此在調用Factory之前,這意味着它會總是被扼殺。

+0

感謝MrDanA,這很有道理。但是如果我想要更細粒度的控制呢?如果我的測試運行Factory(:task),它也會創建相關記錄,那麼我將如何在相關模型中存儲方法? ':grab_external_stuff'是一個類方法。 –

+0

這完全沒有問題!看我的編輯。 – MrDanA

+0

謝謝!我想我正在看着這個錯誤的方向。我試圖動態地傳遞存根,像'Factory(:task,stubs:User.stub(:grab_external_stuff))'(我不知道語法看起來像什麼,但你明白了!)。是否曾經有過這樣的情況?或者這完全是錯誤的軌道? (謝謝,stil試圖抓住測試!!) –

1

您可以根據建議here:grab_external_stuff方法進行存根。另一種方法是使用FakeWeb對API請求進行存根。這對集成測試來說可能更好 - 對於單元測試IMO來說,保存:grab_external_stuff更爲合適。

+0

謝謝zetetic,這是非常有用的信息。目前我正在進行單元測試,但很快就會將注意力轉移到集成測試上。您與Fakeweb的鏈接將會很有用。謝謝 –

相關問題