如何使用RSpec测试ActiveRecord回调?

时间:2010-04-20 08:01:11

标签: ruby-on-rails activerecord rspec callback

如何测试以下示例?

class Post < ActiveRecord::Base
  belongs_to :discussion, touch: true
end

3 个答案:

答案 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

其次

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

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

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

  2. 他们没有确定 save!

    期间调用了哪个回调
  3. 相反,请使用 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