1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails 6で認証認可入り掲示板APIを構築する #7 update, destroy実装

Last updated at Posted at 2020-09-11

Rails 6で認証認可入り掲示板APIを構築する #6 show, create実装

updateテストの実装

残り2アクションupdateとdestroyを実装します。

updateは更新処理です。
createができていたら似たようなものなので、大きく詰まることはないはずです。

spec/requests/v1/posts_controller.rb
...

+  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の実装

app/controllers/v1/posts_controller.rb
...

     def update
-      # TODO
+      if @post.update(post_params)
+        render json: { post: @post }
+      else
+        render json: { errors: @post.errors }
+      end
     end
...

ここももはや特に語ることなし。
これでテスト通過するはずです。

destroyテストの実装

spec/requests/v1/posts_controller.rb
...

+  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の実装

app/controllers/v1/posts_controller.rb
...

     def destroy
+      @post.destroy
+      render json: { post: @post }
     end
...

こちらも非常にシンプル。
今回は短めですが、次にやるseedまで含むと長くなりすぎるのでここまで。

続き

Rails 6で認証認可入り掲示板APIを構築する #8 seed実装

連載目次へ

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?