0

我们有两个工人,如下所示:

class WorkerOne
  include Sidekiq::Worker

  def perform(arg_1, arg_2)
    # some calculation figure out arg_3
    WorkerTwo.perform_async(arg_3, arg_2)
  end
end

class WorkerTwo
  include Sidekiq::Worker

  def perform(arg_3, arg_2)
    # some heavy lifting
  end
end

我们需要测试一下,当WorkerOne被执行时,WorkerTwo是否也入队了?我们尝试使用Sidekiq::Testing.inline!来执行WorkerOne.perform_async(arg_1, arg_2) AsWorkerTwo.perform_async(arg_3, arg_2)从 WorkerOne 内部执行,我们尝试测试WorkerTwo.jobs数组长度以从 更改01,假设作业是从内部排队的WorkerOne,但它没有改变。我们在测试示例中使用了以下期望:

expect{WorkerOne.perform_async(task.id, user.id)}.to change(WorkerTwo.jobs, :size).by(1) 

得到以下错误

 expected `Array#size` to have changed by 1, but was changed by 0

请就所使用的方法提供任何建议和反馈。

4

1 回答 1

0

可以直接调用 Sidekiq 工作者Worker.new.perform,确保它们以内联模式运行 - 简单的 Ruby 方法调用。不是最漂亮的解决方案,但可以方便地进行测试。

  expect {
    WorkerOne.new.perform(10, 15)
  }.to change(WorkerTwo.jobs, :size).by(1)

这是一个可执行的要点 - https://gist.github.com/tejasbubane/09c1412b88ce1e9cb3dacff0817119d2

于 2022-01-20T19:47:48.350 回答