使用rspec测试控制器 - 需要存根before_save

时间:2012-10-03 14:35:11

标签: ruby-on-rails-3 rspec mocha stub

我有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

我该怎么做?

3 个答案:

答案 0 :(得分:2)

你真的不需要删除before_save回调,而是可以存根回调调用的方法。您可以将行为移动到方法和存根。

before_save :downcase_email

def downcase_email
  self.email.downcase!
end

然后在你的规格中:

user.stub(:downcase_email).and_return(true)

答案 1 :(得分:1)

如果你正在使用mock,可以这样做

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

感谢

答案 2 :(得分:-1)

你真的需要那个before_save方法吗?也许如果你覆盖电子邮件=会更好,所以电子邮件会在分配后立即降级,你甚至在保存记录之前就已经下降了

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

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