我发现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方法,那只在我的模型中,我应该创建模型对象并检查它。但是,我想,这是不必要的行动。我可以在没有创建任何实例的情况下检查此方法。
答案 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