1

私はレールにかなり慣れていませんが、解決できない問題に直面しているようです。新しいレコードを作成し、後でそれを使用して新しいサービスをインスタンス化するバックグラウンド ジョブをテストしようとしています。

バックグラウンド ジョブをテストしているので、テスト前にこのサービスの 2 倍を作成する必要があるようですが、パラメーターの 1 つがジョブ内で作成され、ジョブ内で作成された別のレコードを参照として使用します。したがって、実行しようとするたびに、ID に関して常に 1 つの違いがあります。

サンプルコードは次のとおりです。

RSpec.describe UpdateVideoPerfDatasJob, :type => :job do
  it { expect(described_class).to be < ActiveJob::Base }
  context '#perform' do
    let (:split_test) { create(:split_test_for_result_slot) }
    let(:adwords_account) { split_test.adwords_account }
    let(:user) { split_test.adwords_account.user }
    let(:report_service) { instance_double('VideoPerformanceReportBis') }
    let(:api_service) { instance_double('GoogleAdsApiWrapper') }

    let(:campaigns_datas) { '#2 Api called...' }
    let(:segments_datas) { '#3 Api called...' }
    let(:data) { '#4 Global Array Created' }

    before do
      allow(VideoPerformanceReportBis).to receive(:new).with(split_test: split_test, adwords_account: adwords_account, user: user, result_slot: result_slot).and_return(report_service)
      allow(GoogleAdsApiWrapper).to receive(:new).with(adwords_account: adwords_account, user: user).and_return(api_service)
      allow(report_service).to receive(:refresh).with(no_args).and_return('#1 Refresh method')
      allow(report_service).to receive(:call_api_campaigns).with(no_args).and_return(campaigns_datas)
      allow(api_service).to receive(:get_campaigns).with(no_args).and_return('...and campaign gotten !')
      allow(report_service).to receive(:call_api_segments).with(no_args).and_return(segments_datas)
      allow(api_service).to receive(:get_campaigns_segments).with(no_args).and_return('... and segments gotten !')
      allow(report_service).to receive(:create_global_array).with(campaigns_datas, segments_datas).and_return(data)
      allow(report_service).to receive(:update).with(data).and_return('#5 update data')
class UpdateVideoPerfDatasJob < ApplicationJob
  def perform(split_test:, adwords_account:, user:)
    logger.warn 'Updating video performance data'

    history_log = HistoryLog.create(
      split_test: split_test,
      user: user,
      adwords_account: adwords_account,
      operation: 'Update vidéo performance data',
      messages: '',
      status: 'Initiated'
    )

    result_slot = ResultSlot.create(
      split_test: split_test,
      history_log: history_log,
    )

    result_slot.previous_result_slot_id = split_test.result_slot.id unless split_test.result_slot.nil?

    report_service = VideoPerformanceReportBis.new(
      split_test: split_test,
      adwords_account: adwords_account,
      user: user,
      result_slot: result_slot
    )

    response = report_service.refresh
    history_log.update!(
      messages: "Data updated on #{Date.today}",
      status: 'Video performance data updated'
    )
    NotificationsChannel.broadcast_to user, 'Finished Update Video Performance Data Worker'
  end
end

ご覧のとおり、VideoPerformanceReportService は、ジョブ内で作成された result_slot をパラメーターとして使用し、history_log (ジョブ内でも作成されます) を参照として使用しています。

どうすればこれをテストできますか?

(事前にご協力いただきました皆様、ありがとうございました)

4

0 に答える 0