0

TLDR;如何测试异步 ActionMailer 操作(使用 Sidekiq)的 PORO 参数是否正确序列化和反序列化?

Sidekiq 提供 RSpec 匹配器,用于测试作业是否入队并执行作业(使用给定参数)。

--

为了给您一些背景信息,我有一个带有 ActionMailer 的 Ruby on Rails 4 应用程序。ActionMailer 中有一个方法,它接受 PORO 作为参数 - 引用我在电子邮件中需要的数据。我使用 Sidekiq 来处理后台作业。事实证明,当 Sidekiq 决定执行这项工作时,反序列化将失败的论点存在问题。我还没有找到一种方法来测试 un/marshaling 的正确性,以便在执行时使用我调用该操作的 PORO。

例如:

给定一个带有动作的 ActionMailer

class ApplicationMailer < ActionMailer::Base
    def send_alert profile
        @profile = profile
        mail(to: profile.email)
    end
end

...

我会这样使用它

profile = ProfileDetailsService.new(user)
ApplicationMailer.send_alert(profile).deliver_later

...

并进行这样的测试(但这失败了)

let(:profile) { ProfileDetailsService.new(user) }

it 'request an email to be sent' do
  expect {
    ApplicationMailer.send_alert(profile).deliver_later
  }.to have_enqueued_job.on_queue('mailers')
end

任何帮助将不胜感激。

4

1 回答 1

0

您可以以同步方式对其进行测试(仅使用 IRB,无需启动 Sidekiq 工作程序)。

假设您的工人类具有以下实现:

class Worker
  include Sidekiq::Worker

  def perform(poro_obj)
    puts poro_obj.inspect
    # ...
  end
end

您可以打开 IRB ( bundle exec irb) 并键入以下命令:

require 'sidekiq'
require 'worker'

Worker.new.perform

因此,您将以同步方式并使用 Sidekiq 执行代码(请注意,我们调用的是perform方法而不是perform_async)。

我认为这是调试代码的最佳方式。

于 2017-07-25T13:02:53.457 回答