如何使用RSpec测试ActiveRecord回调?

Her*_* D. 15 activerecord rspec ruby-on-rails callback

如何测试以下示例?

class Post < ActiveRecord::Base
  belongs_to :discussion, touch: true
end
Run Code Online (Sandbox Code Playgroud)

zet*_*tic 15

您可以设置消息期望:

it "should touch the discussion" do
  post = Factory.build(:post)
  post.discussion.should_receive(:touch)
  post.save!
end
Run Code Online (Sandbox Code Playgroud)

这个例子使用Factory Girl,但你也可以使用灯具或模拟器.

  • 这真的不是一个"好"的解决方案1)它很慢因为你正在击中数据库而且2)你没有测试触摸是作为after_save回调的一部分被调用的,它可能被任何一个验证或作为保存AR记录的一部分而发生的回调. (2认同)

Jos*_*ter 9

首先

如果你要做的就是声明touch: true你的关联上设置了该选项,那么你可以执行以下操作:

describe Post do
  it { should belong_to(:discussion).touch(true) }
end
Run Code Online (Sandbox Code Playgroud)

其次

一般来说,为了测试回调,请继续阅读.

这里的所有其他答案都有两个缺陷:

  1. 它们需要点击数据库,这可能很慢.

  2. 它们不确定在a期间调用哪个回调save!

相反,使用Shoulda Callback Matchers,它不需要数据库命中,你可以指定你正在测试哪个回调存在.

安装

使用Bundler 安装Shoulda回调匹配器:

group :test do
  gem "shoulda-callback-matchers", "~> 1.0"
end
Run Code Online (Sandbox Code Playgroud)

用法

it { should callback(:some_method).after(:save) }
Run Code Online (Sandbox Code Playgroud)

感谢Beat写这个伟大的图书馆.