我希望我的后台作业可以为某些标记的测试内联运行。我可以通过用perform_enqueued do
Package 测试来实现,但我希望能够用元数据标记它们,如果可能的话,它会自动发生。
我尝试了以下方法:
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
3条答案
按热度按时间mi7gmzs61#
您需要将用于测试的适配器设置为
ActiveJob::QueueAdapters::TestAdapter
,以响应.perform_enqueued_jobs =
。您可以在spec/rails_helper.rb
文件中这样做:ndasle7k2#
在
spec/rails_helper.rb
中:在你的测试中:
然后在测试中:
5hcedyr03#
如何在测试中使用
InlineAdapter
?-ActiveJob::TestHelper
不会让你这么做!我看到你试图使用
InlineAdapter
...我也有同样的愿望--在我所有的测试中使用
InlineAdapter
。不幸的是,至少对于RSpec请求测试(ActionDispatch集成测试),
ActiveJob::TestHelper
会自动包含在测试上下文中,它似乎迫使您使用ActiveJob::QueueAdapters::TestAdapter
而不是InlineAdapter
。gems/activejob-7.0.4.3/lib/active_job/test_helper.rb
拥有以下功能:这会导致它完全 * 忽略 * 您可能拥有的任何
config.active_job.queue_adapter = :inline
配置(因为它 * 覆盖 *queue_adapter
class_attribute
)。我什至尝试覆盖
queue_adapter_for_test
:但是它 * 仍然 * 不起作用,因为
InlineAdapter
没有定义enqueued_jobs
,我们得到了这个:总而言之...在包含
ActiveJob::TestHelper
的任何地方(例如请求测试),都没有 * 支持 * 的方式使用InlineAdapter
。但总是有解决方案...解决方案一:覆盖
enqueued_jobs
等以避免出错假设你使用的是RSpec,你可以添加一个
spec/support/active_job.rb
来完成以下任务:您的特定问题-仅适用于特定的标记测试
在我的例子中,我很高兴只使用内联适配器进行 * 所有 * 测试……
但听起来你只想把它用于一些测试,你用元数据标记。
看起来这并不困难。看起来你所要做的就是在
queue_adapter_for_test
方法中添加一个条件语句来覆盖它:解决方案二:只要按照它希望的那样使用
TestAdapter
即可由于
perform_enqueued_jobs
会导致在块持续期间排队的任何作业立即执行(“内联”),因此您所拥有的应该也可以正常工作-但只有当您将queue_adapter
设置为TestAdapter
(:test
)时:另一个原因是
around(:each)
在before(:each)
之前运行。(技术上是before_setup
回调)。因此,在您的around(:each)
调用perform_enqueued_jobs
时,ActiveJob::Base.queue_adapter
应该仍然是您在配置中配置的。假设你的
config/environments/test.rb
中有类似config.active_job.queue_adapter = :inline
的东西?正如其他答案所指出的,如果你想让你的方法工作,你必须把它改为:test
。因为,正如错误所指出的,
InlineAdapter
没有enqueued_jobs
的概念,相应地,没有定义名为perform_enqueued_jobs
的方法。以下是我的想法,看起来很有效:
现在,您可以继续并注解任何示例组或示例,您希望立即执行排队作业!
在尝试了这两种解决方法之后,我现在推荐第二种,因为它更灵活,并且仍然允许您在任何需要它的测试中进行异步排队,但是当您可以使用更简单的选项时,可以切换到内联执行。