これは、株式会社ミクシィの2020年度新卒研修 (設計・テスト編) で取り扱うRailsのサンプルプロジェクトです
資料: https://speakerdeck.com/rockname/2020-design-test-mixi-training
初回はimageのbuildとDB createをしましょう
$ docker-compose build
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
終わったら、以下のコマンド実行後、 localhost:3000 へアクセスしてみてRails Serverが起動しているか確認してみてください
$ docker-compose up
まずは こちらのPhotobooksControllerクラス を見てください
HTTPリクエスト/レスポンスの処理だけではなく、異常系のバリデーション, アプリケーションロジック, レコードの作成まですべての責務を担っている、いわゆるFat Controllerというやつです
みなさんには、今からこのクラスをリファクタリングをしてもらいます
家族アルバムみてね で販売しているフォトブックを表現するオブジェクトの作成APIです
API: post '/:album_id/photobooks'
Params:
requires :cover_media_id, type: String, desc: '表紙に使う media の id'
requires :cover_media_taken_at, type: String, desc: '表紙に使う media の taken_at'
optional :title, type: String, desc: 'フォトブックのタイトル'
optional :sub_title, type: String, desc: 'フォトブックのサブタイトル'
requires :photobook_pages, type: Array do
requires :page_no, type: Integer, desc: 'ページ番号'
requires :medium_uuid, type: String, desc: 'ページに入れる media の uuid'
optional :comment, type: String, desc: 'ページに入れるコメントの本文'
end
Response:
正常系:
json: {
id: フォトブックのID,
title: フォトブックのタイトル,
subtitle: フォトブックのサブタイトル
},
status: 201
該当するAlbumが存在しない:
json: { code: 'album_not_found', message: 'アルバムが存在していません' },
status: 404
tiltleが20文字を超えている:
json: { code: 'too_long_photobook_title', message: 'フォトブックのタイトルが文字数上限を超えています' },
status: 400
subtitleが20文字を超えている:
json: { code: 'too_long_photobook_subtitle', message: 'フォトブックのサブタイトルが文字数上限を超えています' },
status: 400
commentが200文字を超えている:
json: { code: 'too_long_photobook_comment', message: 'フォトブックのコメントが文字数上限を超えています' },
status: 400
デグレしないようにテストを書きます
RailsのControllerのテストはかなりフレームワークの知識に偏ってしまうものになるので、ここはすでに用意しました
こちらのコマンドで実行できます
$ docker-compose run web rails test test/controllers/api/v1/albums/photobooks_controller_test.rb
以降の方針の詳細は対応するブランチのREADMEを参照してください
question-1 のブランチに切り替えてください
question-2 のブランチに切り替えてください
question-3 のブランチに切り替えてください
question-4 のブランチに切り替えてください