使用Rspec测试Rails ActiveRecord before_create方法

时间:2012-09-18 16:12:47

标签: ruby-on-rails ruby-on-rails-3 unit-testing activerecord rspec

我发现that stackoverflow old post表示model_entity.send(:before_create),但现在它不起作用。那么,我怎样才能测试应该执行before create, update, destroy的方法。还有另一个post但我无法弄清楚,在我的情况下应该做些什么。

class User < ActiveRecord::Base

  before_create do |user|
    user.secure_token = UUID.new.generate
  end
end

关键是我可以使用此代码创建一个方法,然后调用它。还有其他方法吗?

一般来说,如果我想测试after_create方法,那只在我的模型中,我应该创建模型对象并检查它。但是,我想,这是不必要的行动。我可以在没有创建任何实例的情况下检查此方法。

3 个答案:

答案 0 :(得分:5)

这样做的方法很简单:

expect{ user.save }.to change{ user.secure_token }

答案 1 :(得分:3)

刚发现一些棘手的事情。如果需要验证实际结果,请单独验证,因为如果使用:secure_token=,当前rspec不会传递函数.should_receive(:secure_token=)的返回值。例如:

模型如上:

describe "verifies that secure_token= is called" do
  @user = User.new
  @user.should_receive(:secure_token=)
  @user.save
end

describe "verifies the result is set" do
  @user = User.new
  @user.save
  expect(@user.secure_token).not_to be_empty
end

但是如果你在与should_receive相同的测试中把期望不为空,那么测试就会失败。

答案 2 :(得分:2)

如果你正在使用rspec,我猜你可以这样做:

@user = User.new
@user.should_receive(:secure_token)
@user.save