- Task.7-3 の流れと同様に、記事詳細の API とテストの実装をしよう。(※ アプリの仕様として、記事の詳細に関しては誰でもみれるようにしてください)
1. どこをテストするか
- 対象: GET /api/v1/articles/:id
- 前提:ログイン不要
2. 何を期待するか
- status:200
- JSONの形(配列 / オブジェクト):オブジェクト
3. コードの意図(何を確認しているか)
describe "GET /api/v1/articles/:id" do
let(:user) { create(:user) }
let(:article) { create(:article, user: user, status: :published) }
context "記事が存在する場合" do
it "認証なしで記事詳細を取得できる" do
get "/api/v1/articles/#{article.id}"
expect(response).to have_http_status(:ok)
expect(json_response["id"]).to eq(article.id)
expect(json_response["title"]).to eq(article.title)
expect(json_response["body"]).to eq(article.body)
expect(json_response["updated_at"]).to be_present
- describe:このテストは「記事詳細(GET)について」を明示している見出し
- context: このテストの前提条件を明示している
- it:このテストでどのようなことをテストするかを明示している
- テストデータ作成:
- user を1件作成する(記事の投稿者として紐づけるため)
- article を1件作成する(user: user を指定して関連を持たせる)
- status: :published にする(一覧/詳細が「公開のみ返す」仕様でも取得対象になるようにするため)
- リクエスト送信:GET /api/v1/articles/:id
- expect(status):記事詳細のレスポンスにstatus:200を持っていることを確認している
- まずはリクエストが通っているか確認して、その上でidやtitleという中身を確認する
- expect(id):レスポンスのidと自分が取得したい記事のidが一致しているか確認している
- テストが失敗していれば、取得したい記事が返っていないことになる
- expect(updated_at):レスポンスに更新日時の値が入っているかを確認している
- 更新日時が正しいかは別のブロックにコードが記述している