2010-07-07 51 views
5

如何測試當控制器中的動作被訪問時,該控制器的before_filter將被執行?測試before_filter被調用的動作

before_filter在單獨的示例組中進行了測試,因此不需要爲依賴於before_filter的所有操作重複測試。

如果我有

controller.should_receive(:my_before_filter) 
在我的例子

,它工作正常。但是,有了上述期望似乎會導致my_before_filter中的邏輯未被執行(它應該分配一個實例變量)。

如何克服這個限制或嘲弄my_before_filter的行爲(它在控制器上設置實例變量)?還是有更好的方法來做到這一點?


因爲它現在很清楚我在做這一切錯了,我還是想知道一個如何能嘲笑的before_filter中,設置一個實例變量的行爲。當然,在控制器規範中必須要做到這一點?

+0

我找到了一個很好的答案在這裏:http://stackoverflow.com/questions/20775737/how-can-i-spec-before-filters – Boti 2013-12-28 14:14:46

回答

3

RSpec的should_receive意味着你期望接收方法,但作爲一個模擬方法,所以它實際上並沒有調用真正的方法,在這種情況下它是「my_before_filter」。

http://axonflux.com/rspecs-shouldreceive-doesnt-ac

如果my_before_filter在一個單獨的測試已經測試過,就像你說的,你不應該真正關心,真正的一個被調用。

因此,您應該在一次測試中測試實際功能,並測試它是否在另一次測試中被調用,就像您已經在做的那樣。順便說一句,如果你需要它返回一個值,你可以在下一頁看到「返回值」。

http://rspec.info/documentation/mocks/message_expectations.html

+1

謝謝爲了您的迴應。 但是,問題是,我需要一些方法來至少嘲笑my_before_filter的行爲。從before_filter返回值不是很有益,因爲唯一具有任何含義的返回值是「false」,並且會暫停鏈的執行。 我真正想要做的是讓my_before_filter在控制器上設置一個實例變量。我試圖嘲笑它沒有成功。 我應該如何繼續controller.should_receive(:my_before_filter)行,以便它在我使用get:action_name之前分配一個實例變量? – mnylen 2010-07-07 19:14:20

6

測試濾波器,以實現期待過於緊密,IMO。您希望確保實例變量賦值正在發生,而不是它是否發生在過濾器內或動作內 - 測試結果,而不是實現。

+0

你基本上是說過濾器用於控制器內部的許多操作中,我應該複製我創建的用於爲依賴於它的每個操作分配實例變量的測試? – mnylen 2010-07-08 17:04:01

+1

這是一個折衷。誠然,您可能需要重複一些測試,但如果您重構實施,它們不太可能中斷。您可以通過使用共享示例組來減少重複。 另外,如果單獨測試過濾器,您可能會得到更多的測試代碼 - 您必須測試是否爲正確的操作調用過濾器(而不是錯誤的),並且實例變量分配發生在哪裏它應該。 – zetetic 2010-07-08 20:40:28

+0

謝謝。我沒有聽說過共享示例組,但我一定會看到他們是否能夠勝任這項任務。 :) – mnylen 2010-07-10 08:25:20

1

在回答你的問題

「我還是想知道一個如何能嘲笑 的before_filter,設置一個實例變量的行爲。」

這裏是我的答案:

controller.should_receive(:my_before_filter) 
controller.instance_variable_set(:@my_instance_var, "some value") 
+0

我用這個來期望'protect_from_forgery'已經被'expect(controller).not_to接收(:verify_authenticity_token) – hiroshi 2015-06-23 09:50:14

相關問題