rspec rails testing:如何强制 ActiveJob 作业内联运行某些测试?

Posted

技术标签:

【中文标题】rspec rails testing:如何强制 ActiveJob 作业内联运行某些测试?【英文标题】:rspec rails testing: how can I force ActiveJob job's to run inline for certain tests? 【发布时间】:2016-09-13 21:08:19 【问题描述】:

我希望我的后台作业内联运行某些标记的测试。我可以通过使用perform_enqueued do 包装测试来做到这一点,但我希望能够用元数据标记它们,如果可能的话,它会自动发生。

我尝试了以下方法:

it "does everything in the job too", perform_enqueued: true do
end

config.around(:each) do |example|
  if example.metadata[:perform_enqueued]
    perform_enqueued_jobs do
      example.run
    end
  end
end

但它会导致错误:

undefined method `perform_enqueued_jobs=' for ActiveJob::QueueAdapters::InlineAdapter:Class

【问题讨论】:

【参考方案1】:

您需要将用于测试的适配器设置为ActiveJob::QueueAdapters::TestAdapter,它会响应.perform_enqueued_jobs =。您可以在 spec/rails_helper.rb 文件中执行此操作:

ActiveJob::Base.queue_adapter = :test

【讨论】:

【参考方案2】:

在你的spec/rails_helper.rb:

RSpec.configure do |config|
  # ...
  config.include ActiveJob::TestHelper
end

或者在你的测试中:

context "when jobs are executed" do
  include ActiveJob::TestHelper

  # ...
end

然后在你的测试中:

perform_enqueued_jobs do
  example.run
end

【讨论】:

以上是关于rspec rails testing:如何强制 ActiveJob 作业内联运行某些测试?的主要内容,如果未能解决你的问题,请参考以下文章

使用rspec进行Rails Geocoder测试

在 Rails 3 上使用 Rspec 和 MongoID 清理或重置测试数据库

如何在 RSpec 测试中为 ActiveRecord 打开 SQL 调试日志记录?

在rails 2.3+中测试(rspec)嵌套模型部分

.env 未使用 rspec 在 Rails 的测试环境中加载

无法使shared_contexts在rspec 3.9.0 / rspec-rails 4中工作