ruby - 有没有一种干净的方法来测试 Rspec 中的 ActiveRecord 回调?

标签 ruby activerecord rspec callback

假设我有以下 ActiveRecord 类:

class ToastMitten < ActiveRecord::Base
  before_save :brush_off_crumbs
end

是否有一种干净的方法来测试 :brush_off_crumbs 是否已设置为 before_save 回调?

我所说的“干净”是指:

  1. “没有实际保存”,因为
    • 它很慢
    • 我不需要测试 ActiveRecord 是否正确处理 before_save 指令;我需要测试我是否正确地告诉它在保存之前要做什么。
  2. “没有通过未记录的方法进行黑客攻击”

我找到了满足标准 #1 但不满足标准 #2 的方法:

it "should call have brush_off_crumbs as a before_save callback" do
  # undocumented voodoo
  before_save_callbacks = ToastMitten._save_callbacks.select do |callback|
    callback.kind.eql?(:before)
  end

  # vile incantations
  before_save_callbacks.map(&:raw_filter).should include(:brush_off_crumbs)
end

最佳答案

使用run_callbacks

这不那么骇人听闻,但并不完美:

it "is called as a before_save callback" do
  revenue_object.should_receive(:record_financial_changes)
  revenue_object.run_callbacks(:save) do
    # Bail from the saving process, so we'll know that if the method was 
    # called, it was done before saving
    false 
  end
end

使用这种技术来测试 after_save 会更笨拙。

关于ruby - 有没有一种干净的方法来测试 Rspec 中的 ActiveRecord 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13051082/

相关文章:

ruby - 如何在 Sinatra 应用程序中使用 sidekiq 监控?

ruby - 为什么 Google 的 Cityhash gem 安装不了?

ruby-on-rails - Rails - 如何根据 bool 字段进行搜索? (MySQL 错误)

ruby-on-rails - 在 View 规范中测试 "dynamic"页面标题 (Rails 4 + RSpec 3)

ruby-on-rails - 测试设计 - Capybara::ElementNotFound:无法找到 xpath "/html"

Ruby - 数组中至少有一项也符合要求

ruby-on-rails - 在同一 View RoR 中的表单之间传递参数

sql - Yii2 ActiveRecord : composite IN condition

ruby-on-rails - find_by_x 真的(温和地)被弃用了吗?

ruby - RSpec TextMate Bundle [规范/自动运行(LoadError)]