使用Sidekiq测试异步ActionMailer方法的解组

时间:2017-07-25 11:03:48

标签: ruby-on-rails rspec sidekiq rspec-sidekiq

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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)。

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