如何测试以下示例?
class Post < ActiveRecord::Base
belongs_to :discussion, touch: true
end
答案 0 :(得分:15)
您可以设置message expectation:
it "should touch the discussion" do
post = Factory.build(:post)
post.discussion.should_receive(:touch)
post.save!
end
此示例使用Factory Girl,但您也可以使用灯具或模拟。
答案 1 :(得分:9)
如果您要做的就是断言您的关联设置了touch: true
选项,那么您可以执行以下操作:
describe Post do
it { should belong_to(:discussion).touch(true) }
end
一般来说,为了测试回调,请继续阅读。
这里的所有其他答案都有两个缺陷:
他们需要点击数据库,这可能会很慢。
他们没有确定 save!
相反,请使用 Shoulda Callback Matchers ,它不需要数据库命中,您可以指定您正在测试哪个回调存在。
使用Bundler安装Shoulda Callback Matchers:
group :test do
gem "shoulda-callback-matchers", "~> 1.0"
end
it { should callback(:some_method).after(:save) }
感谢Beat撰写了这个优秀的图书馆。
答案 2 :(得分:1)
您可以模拟#touch通话,或验证回调对其的影响。
it "should touch the discussion" do
original_updated_at = @discussion.updated_at
@post.save!
@post.discussion.updated_at.should_not_be == original_updated_at
end