1

私はUser.rbモデルに持っています:

before_save { self.email.downcase! }

そして私はこのメソッドをスタブする必要がありますusers_controller_spec.rb

User.any_instance.stubs(:before_save_callback_method).returns(true) #doesn't work
User.any_instance.stubs(:valid?).returns(true) #works

これどうやってするの?

4

3 に答える 3

3

実際には before_save コールバックをスタブ化する必要はなく、コールバックによって呼び出されるメソッドをスタブ化することができます。動作をメソッドに移動し、代わりにスタブにすることができます。

before_save :downcase_email

def downcase_email
  self.email.downcase!
end

次に、仕様で:

user.stub(:downcase_email).and_return(true)
于 2012-10-03T14:53:17.797 に答える
1

モックを使用している場合は、次のように実行できます

describe User
  it "should accept email_downcase before save" do
    user = mock(User)
    user.should_receive(:email_down).and_return(email.downcase) # => use return in case you want to
  end
end

ありがとう

于 2012-10-03T14:45:00.380 に答える
-1

その before_save メソッドが本当に必要ですか? たぶん、email= をオーバーライドしたほうがよいので、メールは割り当て直後に小文字化され、レコードを保存する前でも小文字化されます

User < ActiveRecord
  def email=(value)
    write_attribute(:email, value.downcase)
  end
end

それがあなたのテストに役立つかどうかはわかりませんが、 before_save コールバックよりも優れている場合があります

于 2012-10-06T23:20:02.990 に答える