2009-05-27 9 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 

このテストでは、現在渡しますが、私は有効なメールアドレスを提供するとき、それはまた渡します。

モカを使用して期待値を設定するにはどうすればよいですか?任意のUserインスタンスのsaveメソッドをテストするような(または他の疑似フレームワーク)呼び出しは一度も呼び出されませんか?

(好ましくは、ユーザーを取得する方法の実装として、find_by_emailメソッドをモック/スタブせず、将来的に変更される可能性があります)、このわたしつまずいたかもしれない他の人のために

乾杯

答えて

16

を、私が見つかりました。あなたがこれを行うことができモカでのモックフレームワークとしてRRを扱った別のポストで答え...:

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

RSpecモックでこれを実行することは、_all_続くインスタンスに影響しますので、注意してください。モカは予想どおり仕様に従ってモックを引き下げる。 – avocade

4

代わりにあなたが

ような何かを行うことができます
user = mock 
User.expects(:find).returns user 
user.expects(:save).never 
+4

User.expects(:find)は、User.findが呼び出されているかどうかは気にしていないので、おそらくUser.stubs(:find)と同じです。User#saveは呼び出されません。 –

関連する問題