2009-05-27 58 views
3

假設這個Ruby代碼:摩卡:你如何設定一個實例方法的期望?

class User 
    def self.failed_login!(email) 
    user = User.find_by_email(email) 
    if user 
     user.failed_login_count = user.failed_login_count + 1 
     user.save 
    end 
    end 
end 

我想寫一個測試,測試時提供一個無效的電子郵件user.save永遠不會被調用。例如:

it "should not increment failed login count" do 
    User.expects(:save).never() 
    User.failed_login!("doesnotexist") 
end 

此測試目前通過,但當我提供有效的電子郵件地址時,它也會通過。

如何使用Mocha設置期望值? (或任何其他模擬框架),以便它測試任何用戶實例的保存方法永遠不會被調用?

(最好沒有磕碰/嘲諷find_by_email方法,爲如何讓用戶在將來可能會改變實現)

乾杯

回答

16

對於其他人可能已經迷迷糊糊問這個問題,我找到了回答就是應對RR爲模擬框架另一篇文章...在摩卡,你可以這樣做:

User.any_instance.expects(:save).never() 
+1

只要小心運行這與RSpec模擬,因爲它會影響_all_下面的實例。按預期,摩卡將模擬量拉低。 – avocade 2011-03-13 16:52:58

4

或者你可以不喜歡

user = mock 
User.expects(:find).returns user 
user.expects(:save).never 
+4

在這種情況下,User.expect(:find)可能會更好,因爲我們並不關心User.find是否被調用 - 只是沒有調用User#save。 – 2010-12-02 11:02:27

相關問題