【问题标题】:Cucumber - perform ActiveJob `perform_later` jobs immediatelyCucumber - 立即执行 ActiveJob `perform_later` 工作
【发布时间】:2016-11-10 00:51:29
【问题描述】:

我有许多使用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 我现在正在查看我的工作代码,显然我的测试在步骤中使用了.perform_now,它似乎工作正常。我不相信我必须在任何地方修改隐藏设置...查看我的答案

标签: ruby-on-rails-5 rails-activejob


【解决方案1】:

我在测试中切换到 :test 适配器,它对我有用:

# initialisers/test.rb

config.active_job.queue_adapter = :test

# features/support/env.rb

World(ActiveJob::TestHelper)

【讨论】:

    【解决方案2】:

    看起来只要你在黄瓜步骤中调用.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 应该没关系

    【讨论】:

    • 谢谢!如果您直接测试 Jobs,这是理想的选择。如果您想继续在集成级别进行测试,我找到了另一种方法(例如,注册应该发送一封电子邮件)。我很快就把它写在了我的博客中,并在我完善它时将它作为单独的答案发布。这是链接:rystraum.com/…
    • 嘿,谢谢,这将是一个很好的补充,尽管电子邮件有点特殊。实际上我自己的用例涉及调度,但是由于 whenever 调度在 Cucumber 中不容易集成,所以我决定编写一个步骤,其中包含计划操作中实际发生的情况,并且直接在步骤中启动作业更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多