2015-07-06 37 views
0
def method1 
    if params[:hotel].present? 
    end 
end 

def method2 //accessed via GET 
    @hotel = params[:hotel] 
    method1 
end 

所以,現在我想寫一個RSpec的測試method1。我如何預設params變量?只是要清楚,我不能寫如何爲無法通過GET訪問的控制器方法編寫RSpec並使用參數?

get :'method1', request_params 
+0

你爲什麼要這麼做?如果無法訪問,它應該是私人的。如果它應該是私人的,你不應該測試它。 –

+0

我完全明白這一點。但是,我只是試圖測試函數的行爲,因爲它很關鍵。當然,必須有一種方法。我知道測試私有函數可能沒有意義,但從編程的角度來看,有什麼辦法嗎? – user2441151

回答

1

您可以自己從字面上設置PARAMS並呼籲控制器例如方法做到這一點:

expect(@controller).to receive(:params).and_return(:hotel => "Sample Hotel") 
expect(...) # your spec expectations here 
expect(@controller.send(:method1)).to eq(expected_return_value) 

如前所述,雖然,它被認爲是不最佳實踐通過傳遞所有可能的變化,以測試你的控制器的私人/非操作方法......

相反,你有望試探公衆的行爲,並測試您的私有方法是做正確的事情,獲得最終結果 - 例如,而不是特別是測試方法1,您應該使用方法1預期能夠正確響應的所有變體來測試方法2。

+0

在我的測試代碼, 'PARAMS = {} PARAMS [:酒店] = 「樣本酒店」 @ controller.send(:方法1)' 在運行測試用例,並把'binding.pry'內' method1',我發現'params'仍然是空的。 – user2441151

+0

好吧,去挖掘我是如何做到的......其實我對控制器設定了期望。畢竟,「params」只是另一種方法。我已經更新了我的回答以反映。 –

+0

謝謝。這工作完美 – user2441151

相關問題