20221103

今日は横浜に来ている。最後いつ来たか分からない

仕事で、管理画面で同期的に処理されているDBのIO処理をSidekiqを使って非同期処理に書き換えるということをしている。

ざっくりとした機能要件は以下である。

概要:ユーザーが登録した商品のステータスを変更する

管理画面からIDとステータスを設定、更新ボタンを押すとSidekiqにキューが積まれる

ジョブの内容

  • ステータスの更新
  • ユーザーへの変更内容に関するメール送信
  • ステータス更新履歴テーブルに各種記録を追加(変更前後のステータス、メール送信フラグ、ワーカーの実行結果)
  • 処理の成功・失敗に関わらずSlackに通知を送る
    • @errors=[]というメンバ変数を用意し、失敗時は例外を投げるようにして失敗の内容を変数に入れ、中身をそのままSlackに投げる
    • (そういえば成功時の通知のことを何も考えていなかった。帰ってから実装しなければならない)

実際やってみるとやることが多くて見積もりに失敗している。

帰ってからやること

  • 成功のときもSlack通知
  • RSpecをかく
    • createアクション
      • リクエストヘッダにparamsを指定
      • メール送信なしの場合の正常系・異常系のテストをする
      • メール送信アリの場合
    • sidekiq workerのperform_asyncメソッドの返り値のテスト
      • メール送信なし/Slack通知

非同期処理そのもののユニットテストはWorker.new.perform

describe Worker do
  let(:worker) { Worker.new }
  let(:params) { syo_id: xx, ..., pc_title: '' }

  describe '#perform' do
    it '正常系' do
      expect(worker.perform(params)).to eq 'Successful...'
    end
  end
end

controller

describe '#create' do
  it '正常系' do
    expect(post :create, params: {syo_id: syo_id, ..}).to change ..
  end
end