今日は横浜に来ている。最後いつ来たか分からない
仕事で、管理画面で同期的に処理されているDBのIO処理をSidekiqを使って非同期処理に書き換えるということをしている。
ざっくりとした機能要件は以下である。
概要:ユーザーが登録した商品のステータスを変更する
管理画面からIDとステータスを設定、更新ボタンを押すとSidekiqにキューが積まれる
ジョブの内容
- ステータスの更新
- ユーザーへの変更内容に関するメール送信
- ステータス更新履歴テーブルに各種記録を追加(変更前後のステータス、メール送信フラグ、ワーカーの実行結果)
- 処理の成功・失敗に関わらずSlackに通知を送る
@errors=[]
というメンバ変数を用意し、失敗時は例外を投げるようにして失敗の内容を変数に入れ、中身をそのままSlackに投げる- (そういえば成功時の通知のことを何も考えていなかった。帰ってから実装しなければならない)
実際やってみるとやることが多くて見積もりに失敗している。
帰ってからやること
- 成功のときもSlack通知
- RSpecをかく
- createアクション
- リクエストヘッダにparamsを指定
- メール送信なしの場合の正常系・異常系のテストをする
- メール送信アリの場合
- sidekiq workerのperform_asyncメソッドの返り値のテスト
- メール送信なし/Slack通知
- createアクション
非同期処理そのもののユニットテストは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