2016-11-10 86 views
3

我有很多作业使用perform_later调用其他嵌套作业。但是,在黄瓜的一些测试中,我想立即执行那些工作以进行其余的测试。黄瓜 - 立即执行ActiveJob`perform_later`作业

我认为这将是足够的补充

# 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) 

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

+0

你找到这个问题的答案?我现在正遇到同样的问题。 – Rystraum

+0

嘿@Rystraum我正在看我的工作代码,显然我的测试在步骤中使用'.perform_now',它似乎工作正常。我不相信我必须在任何地方修改隐藏的设置...查看我的回答 –

回答

0

它将只要您拨打.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要不要紧

+0

谢谢!如果您直接测试作业,这是理想的。如果您想继续在集成级别进行测试(例如注册应发送电子邮件),我找到了另一种方法。我真的很快在我的博客上写下了它,当我开始打磨它时,它将作为一个单独的答案发布。这里的链接:http://rystraum.com/testing-email-deliveries-using-cucumbercapybaraminitest/ – Rystraum

+0

嘿谢谢,这将是一个很好的补充,虽然电子邮件有点特殊情况。实际上,我自己的用例涉及到调度,但由于“每当”调度在Cucumber中不容易集成,我决定在预定的操作中实际发生的事情写出一个步骤,并且在该步骤中直接启动作业更简单。 –

0

我切换到:测试适配器测试和它的工作对我来说:

# initialisers/test.rb 

config.active_job.queue_adapter = :test 

# features/support/env.rb 

World(ActiveJob::TestHelper)