2017-07-25 48 views
0

TLDR;如何測試異步ActionMailer操作(使用Sidekiq)的PORO參數是否正確序列化和反序列化?使用Sidekiq測試解組異步ActionMailer方法

Sidekiq提供RSpec匹配器,用於測試作業是否入隊並執行作業(使用給定的參數)。

-

給你一些情況下,我有一個Ruby on Rails的4應用程序與的ActionMailer。 ActionMailer內部是一種將PORO作爲參數的方法 - 引用我在電子郵件中需要的數據。我使用Sidekiq來處理後臺作業。事實證明,在將Sidekiq決定執行這項工作時失敗的觀點反序列化時存在一個問題。我一直無法找到一種方法來測試un/marshaling的正確性,以便我執行時使用的PORO被調用。

例如:

鑑於與動作

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

一個的ActionMailer ......

我會使用這樣的

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

...

A nd有這樣的測試(但這失敗)

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

你可以用同步的方式測試它(只使用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)。

我認爲這是調試代碼的最好方法。

+0

如何爲ActionMailer動作執行此操作? –

+0

您能否用更詳細的信息編輯您的問題? –

+0

這個問題已經更新。 –