←Rails 6で認証認可入り掲示板APIを構築する #6 show, create実装
updateテストの実装
残り2アクションupdateとdestroyを実装します。
updateは更新処理です。
createができていたら似たようなものなので、大きく詰まることはないはずです。
...
+ describe "PUT /v1/posts#update" do
+ let(:update_param) do
+ post = create(:post)
+ update_param = attributes_for(:post, subject: "update_subjectテスト", body: "update_bodyテスト")
+ update_param[:id] = post.id
+ update_param
+ end
+ it "正常レスポンスコードが返ってくる" do
+ put v1_post_url({ id: update_param[:id] }), params: update_param
+ expect(response.status).to eq 200
+ end
+ it "subject, bodyが正しく返ってくる" do
+ put v1_post_url({ id: update_param[:id] }), params: update_param
+ json = JSON.parse(response.body)
+ expect(json["post"]["subject"]).to eq("update_subjectテスト")
+ expect(json["post"]["body"]).to eq("update_bodyテスト")
+ end
+ it "不正パラメータの時にerrorsが返ってくる" do
+ put v1_post_url({ id: update_param[:id] }), params: { subject: "" }
+ json = JSON.parse(response.body)
+ expect(json.key?("errors")).to be true
+ end
+ it "存在しないidの時に404レスポンスが返ってくる" do
+ put v1_post_url({ id: update_param[:id] + 1 }), params: update_param
+ expect(response.status).to eq 404
+ end
+ end
...
例によってcontroller未実装なのでテストはコケます。
updateの実装
...
def update
- # TODO
+ if @post.update(post_params)
+ render json: { post: @post }
+ else
+ render json: { errors: @post.errors }
+ end
end
...
ここももはや特に語ることなし。
これでテスト通過するはずです。
destroyテストの実装
...
+ describe "DELETE /v1/posts#destroy" do
+ let(:delete_post) do
+ create(:post)
+ end
+ it "正常レスポンスコードが返ってくる" do
+ delete v1_post_url({ id: delete_post.id })
+ expect(response.status).to eq 200
+ end
+ it "1件減って返ってくる" do
+ delete_post
+ expect do
+ delete v1_post_url({ id: delete_post.id })
+ end.to change { Post.count }.by(-1)
+ end
+ it "存在しないidの時に404レスポンスが返ってくる" do
+ delete v1_post_url({ id: delete_post.id + 1 })
+ expect(response.status).to eq 404
+ end
+ end
...
postの時と逆で、実行寺にレコード数が1減ることを確認します。
なおポイントとしては、
expectの前にdelete_postを呼んでいることです。
以前記載した通りletは遅延評価をされるので、もしexpectの前にdelete_postが無かった場合、expect内のdelete_post.id
でレコードが生成され、delete v1_post_url
で1レコード消える。つまりexpectブロック内で+1-1=0となり、レコード数に変化が生まれません。
そのためexpect前にレコードを生成し、expectの中でdeleteが実行されることにより-1レコードとなるわけです。
destroyの実装
...
def destroy
+ @post.destroy
+ render json: { post: @post }
end
...
こちらも非常にシンプル。
今回は短めですが、次にやるseedまで含むと長くなりすぎるのでここまで。
続き
→Rails 6で認証認可入り掲示板APIを構築する #8 seed実装
【連載目次へ】