前提
- 既存のコードに合わせなくて良い、良い状態を考えて作ること
簡単なチェック
- シリアライザは単数系で書くこと
- 各ファイル、クラス名の単数複数が正しいこと
- 各種URLが本番用のURLになっていること -dev などがつかないURL になってること。
一般的なチェック
- メソッドに ! をつける場所は適切ですか
- Aws::SQS::Client のテストは instance double を使わずに、AWS SDK for Ruby を利用
- raise した エラーは 明示的に capture せずとも Sentry が自動で拾ってる可能性を考慮
rspec
subject の命名
# context など rspec 命名と被るものを利用している部分があるが避けたい
subject(:context) { described_class.call }
# 一般的には result や outcome などが推奨される。
subject(:result) { described_class.call }
時間停止系処理
# travel_back を忘れがちなのでブロックで書く
travel_to Time.zone.local(2024, 5, 25, 10, 0, 0)
# 固定した日付は
around { |e| freeze_time { e.run } }
変更がない時の matcher
# before
result
expect { result }.not_to change { member_last_access.reload.last_access_at }
# expectにブロックを渡して、not_to changeのテストにする
expect(member_last_access.reload.last_access_at).to eq(2.days.ago)
変更、更新系のテストの際は change mather を利用したい。
インタラクタ
# interactor のテストは result.success? であることも確認したい
expect(result).to be_success
Serializable Resources
ActiveModelSerializers::SerializableResource.new(
user,
serializer: UserSerializer,
adapter: :attributes,
hoge: 'test'
).serializable_hash
以下の様に参照できるので、シリアライザで複数のデータソースから作ったほうがSQLがシンプルになる場合は活用していきたい。
SQLを無理に分割しようとするよりも2つ渡して処理したほうがいい時もある。
class UserSerializer < ApplicationSerializer
attribute :test_val do
instance_options[:hoge]
end
end
Serializable Resources new で実行しなくても渡せる
render(
json: result.members,
each_serializer: MemberSerializer,
sorted_messages: result.sorted_messages,
)
イベント計測
Chrome拡張機能で検査可能
pushLaEventを利用すること