黄瓜 - 立即执行ActiveJob `perform_later`任务

4

我有很多工作,其中使用perform_later调用其他嵌套工作。然而,在Cucumber上进行一些测试时,我想立即执行这些工作,以便继续测试的其余部分。

我认为只需添加以下内容即可:

# features/support/active_job.rb
World(ActiveJob::TestHelper)

在步骤定义文件中调用使用此功能的作业

perform_enqueued_jobs do
  # call step that calls MyJob.perform_later(*args)
end

然而,我遇到了类似的问题。
undefined method `perform_enqueued_jobs' for #<ActiveJob::QueueAdapters::AsyncAdapter:0x007f98fd03b900> (NoMethodError)

我错过了什么/做错了什么吗?

你找到答案了吗?我现在也遇到了同样的问题。 - Rystraum
嘿@Rystraum,我现在正在查看我的工作代码,显然我的测试在步骤中使用了.perform_now,并且似乎运行良好。我不认为我需要修改任何隐藏设置...请查看我的答案。 - Cyril Duchon-Doris
2个回答

1

我在测试中切换到了:test适配器,效果很好:

# initialisers/test.rb

config.active_job.queue_adapter = :test

# features/support/env.rb

World(ActiveJob::TestHelper)

0

看起来只要在cucumber步骤内调用.perform_now,即使有嵌套的.deliver_later作业,它也可以正常工作。

#support/active_job.rb
World(ActiveJob::TestHelper)

#my_job_steps.rb
Given(/^my job starts$/) do
  MyJob.perform_now(logger: 'stdout')
end

#jobs/my_job.rb
...
MyNestedJob.perform_later(*args) # is triggered during the step
...

此外,在我的environment/test.rb文件中,我没有写任何关于ActiveJob的内容,默认情况下工作正常。我相信测试的默认适配器是:inline,因此调用.deliver_later_now不应该有影响。

谢谢!如果您直接测试工作,这很理想。如果您想在集成级别进行测试(例如,注册应该发送电子邮件),我找到了另一种方式。我很快在我的博客中写了它,并将其发布为单独的答案,当我完成细节时。这是链接:http://rystraum.com/testing-email-deliveries-using-cucumbercapybaraminitest/ - Rystraum
嘿,谢谢,这将是一个不错的补充,尽管电子邮件有点特殊。实际上,我的用例涉及调度,但由于whenever调度不容易集成到Cucumber中,我决定编写一个步骤,描述计划操作中实际发生的事情,并且在步骤中直接启动作业更简单。 - Cyril Duchon-Doris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接