【问题标题】:Test that Sidekiq job called mailer测试名为 mailer 的 Sidekiq 作业
【发布时间】:2018-06-12 22:01:54
【问题描述】:

我正在测试我的 Sidekiq 作业,并试图弄清楚如何确保它在作业中调用具有正确参数的方法。这是我的实际工作:

工作:

def perform
  csv = Campaign.to_csv
  email = current_sso_user.email

  CampaignMailer.send_csv(email, csv).deliver_now
end

我想构建一个测试,确保使用正确的参数调用 CampaignMailer.send_csv。

这是我目前拥有的:

测试:

RSpec.describe CampaignsExortJob, type: :model do
  subject(:job) { CampaignsExportJob.new }

  describe '#perform' do
    let(:campaign) { create(:campaign) }

    it 'sends the csv email' do
      expect(job).to receive(:CampaignMailer.send_csv)
    end
  end
end

但这是一个语法错误。谁能给我一些关于如何正确测试的指导?谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby sidekiq


    【解决方案1】:

    来自 rspec 文档(https://relishapp.com/rspec/rspec-mocks/v/2-14/docs/message-expectations/expect-message-using-should-receive):

    期待带有参数的消息 给定 一个名为“spec/account_spec.rb”的文件,其中包含:

    require "account"
    require "spec_helper"
    
    describe Account do
      context "when closed" do
        it "logs an account closed message" do
          logger = double("logger")
          account = Account.new logger
    
          logger.should_receive(:account_closed).with(account)
    
          account.close
        end
      end
    end
    

    并且 一个名为“lib/account.rb”的文件,其中包含:

    Account = Struct.new(:logger) do
      def close
        logger.account_closed(self)
      end
    end
    

    什么时候 我运行 rspec spec/account_spec.rb 然后 输出应包含“1 个示例,0 个失败”

    所以在你的情况下:

    CampaignMailer.should_receive(:send_csv).with(<expected_email_arg>, <expected_csv_arg>)
    

    您还可以添加.and_return(&lt;expected_return_value&gt;) 来测试返回值。

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2013-10-30
      • 2016-05-29
      相关资源
      最近更新 更多