2017-07-18 81 views
0

我在我的Rails應用程序的私人模型方法,它是一種生活的品質至關重要,因爲我們知道它,我想用RSpec的,以便它叫聲,如果未來篡改的變化進行測試怎麼運行的。Rspec的測試Rails應用程序

class MyModel < ApplicationRecord 
    belongs_to something 
    has_many somethings 

    after_create :my_vital_method 

    validates :stuff 

    private 
    def my_vital_method 
     #do stuff 
    end 
end 

當我嘗試調用方法在一個RSpec測試,我得到以下錯誤信息:

NoMethodError:未定義的方法`my_vital_method」爲#<類:......>

問題:如何調用rspec的私人模型的方法?

+1

理想情況下,你不應該測試私人方法。而是測試使用它的方法。 –

+0

這是否意味着測試'after_create'?我是否仍然需要調用私有方法? – BrianWilson

+1

理想情況下,您應該檢查是否正在調用私有方法。 e.g'allow_any_instance_of(用戶)。爲了接收(:send_welcome_email)' –

回答

1

根據定義,您不允許從課外呼叫私人方法,因爲他們是私人

幸運的是,你可以做你想做的,如果你使用object.send(:my_vital_method)其跳過的方法調用的限制測試。

現在,更大的問題是,你真的是讓你的對象更脆,因爲從外面像調用可能需要實施細則,將不同步與類隨着時間的推移。您正在有效地增加對象API。

最後,如果您試圖防止篡改,那麼您正在傾斜風車 - 您不能在Ruby中,因爲我可以簡單地重新定義您的方法並確保如果我的新方法是從您的防篡改檢查代碼,我打電話給原始版本,否則我做我邪惡的東西。

祝你好運。

0

如果你的私有方法需要測試它可能應該是另一個類的公共方法。如果你發現這個類的名稱來定義它的目的,然後創建你願意,你最終會像

def my_vital_method 
    MyVitalClass.new.do_stuff 
end 

方法簽名,現在你可以寫一個do_stuff規範。