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 方法吗?如果您覆盖电子邮件 = 可能会更好,因此电子邮件在分配后立即被小写,并且您甚至在保存记录之前就已将其小写

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

我不知道这对您的测试是否有帮助,但有时这比 before_save 回调更好

于 2012-10-06T23:20:02.990 回答