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
非常感谢任何帮助。
答案 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
)。
我认为这是调试代码的最佳方式。