【发布时间】:2015-01-24 04:22:49
【问题描述】:
我有一个 Rails 3 应用程序。我对某些模型使用 after_save 回调,对其中一个模型使用 after_commit 回调。代码中的所有代码都可以正常工作,但是在 RSpec 测试期间,当我保存 Thing 模型时,不会调用 after_commit 回调。
例如
class ThingObserver < ActiveRecord:Observer
observe Thing
def after_commit(thing)
puts thing.inspect
end
end
如果我将方法名称更改为after_save,它会在测试期间正常调用。我需要能够将after_commit 用于此特定模型,因为在某些情况下,对“事物”的更改发生在 Web 服务器中,但观察者的影响发生在 Sidekiq 工作人员中,而 after_save 不会保证数据在工作人员准备好时已提交并可用。
RSpec 的配置在 spec/spec_helper.rb 中如下所示
Rspec.configure do |config|
#yada yada
config.use_transactional_fixtures = true
#yada yada
end
我还调整了 rake db:create 以便它从 structure.sql 文件中提取。在 lib/tasks/db.rb 中
task setup: [ 'test:ensure_environment_is_test', 'db:create', 'db:structure:load', 'db:migrate', 'db:seed' ]
我这样做是为了运行测试以确保数据库执行外键约束。
有没有办法同时运行 after_save 和 after_commit 回调而不使 Rspec use_transactional_fixtures == false?
或者,有没有办法将 config.use_transactional_fixtures 设置为 'false' 仅用于该测试或该测试文件?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 rspec observers