In Anlehnung an den vorherigen Index werden wir Showtests und Controller implementieren. show ist das Verhalten beim Suchen und Zurückgeben basierend auf der ID des Parameters.
Geht es beim Test darum, eine Antwort normal und 404 zurückzugeben, wenn die ID nicht vorhanden ist?
spec/requests/v1/posts_controller.rb
...
+ describe "GET /v1/posts#show" do
+ let(:post) do
+ create(:post, subject: "Test zeigen")
+ end
+ it "Der normale Antwortcode wird zurückgegeben" do
+ get v1_post_url({ id: post.id })
+ expect(response.status).to eq 200
+ end
+ it "Betreff wird korrekt zurückgegeben" do
+ get v1_post_url({ id: post.id })
+ json = JSON.parse(response.body)
+ expect(json["post"]["subject"]).to eq("Test zeigen")
+ end
+ it "Die Antwort 404 wird zurückgegeben, wenn die ID nicht vorhanden ist" do
+ get v1_post_url({ id: post.id + 1 })
+ expect(response.status).to eq 404
+ end
+ end
...
Die Erklärung wurde weggelassen, aber es wird verzögert ausgewertet, wenn sie aufgerufen wird. Mit anderen Worten, es wird nicht ausgeführt, bis der variable Beitrag aufgerufen wird, sondern wird ausgeführt, wenn er aufgerufen wird.
Im obigen Beispiel wird es erstellt, wenn es im it-Block post.id heißt. Natürlich ist der Controller nicht implementiert, daher ist der Test Moos.
app/controllers/v1/posts_controller.rb
...
def show
- # TODO
+ render json: { post: @post }
end
...
Zwei der drei hinzugefügten Tests bestehen den 404-Fehlertest nicht. Ich erhalte eine RecordNotFound-Ausnahme in Rails und eine Nicht-JSON-Antwort.
Ändern Sie application_controller.rb, die die Superklasse aller Controller ist.
app/controller/application_controller.rb
# frozen_string_literal: true
#
#Superklasse von Controller
#
class ApplicationController < ActionController::API
+ rescue_from ActiveRecord::RecordNotFound, with: :render_404
+ def render_404
+ render status: 404, json: { message: "record not found." }
+ end
end
Wenn Sie wie oben beschrieben antworten, wird eine Ausnahme "Datensatz nicht gefunden" (ActiveRecord :: RecordNotFound) ausgelöst und "render_404" ausgeführt. Und json wird mit dem 404-Antwortcode "status: 404" zurückgegeben.
Wenn Sie es bisher implementieren, besteht der Test. Nur für den Fall, lassen Sie es uns mit Curl überprüfen.
$ curl localhost:8080/v1/posts/0
{"message":"record not found."}
$ curl localhost:8080/v1/posts/1
{"post":{"id":1,"subject":"hoge","body":"fuga","created_at":"2020-09-05T13:50:01.797Z","updated_at":"2020-09-05T13:50:01.797Z"}}
Da beim Erstellen ein neuer Datensatz erstellt wird, stellen Sie sicher, dass er um eins erhöht wird, dass der inkrementierte Datensatz mit der Zeit übereinstimmt, zu der er registriert wurde, und dass er nicht erstellt werden kann, wenn die Parameter falsch sind.
spec/requests/v1/posts_controller.rb
+ describe "POST /v1/posts#create" do
+ let(:new_post) do
+ attributes_for(:post, subject: "create_Probandentest", body: "create_Körpertest")
+ end
+ it "Der normale Antwortcode wird zurückgegeben" do
+ post v1_posts_url, params: new_post
+ expect(response.status).to eq 200
+ end
+ it "Ein weiterer Fall wird zurückgesandt" do
+ expect do
+ post v1_posts_url, params: new_post
+ end.to change { Post.count }.by(1)
+ end
+ it "subject,Körper kehrt korrekt zurück" do
+ post v1_posts_url, params: new_post
+ json = JSON.parse(response.body)
+ expect(json["post"]["subject"]).to eq("create_Probandentest")
+ expect(json["post"]["body"]).to eq("create_Körpertest")
+ end
+ it "Fehler werden zurückgegeben, wenn der Parameter ungültig ist" do
+ post v1_posts_url, params: {}
+ json = JSON.parse(response.body)
+ expect(json.key?("errors")).to be true
+ end
+ end
Wenn Sie attribute_for
verwenden, wird das Objekt zurückgegeben, ohne wie in build in der DB gespeichert zu werden.
Zu diesem Zeitpunkt wird es als einfaches Objekt anstelle des ActiveRecord-Formats zurückgegeben. Dies ist praktisch, da zum Zeitpunkt der Veröffentlichung keine unnötigen Spalten wie id, created_at, update_at vorhanden sind.
Achten Sie zu diesem Zeitpunkt darauf, den Variablennamen nicht in "post" zu ändern. Zum Zeitpunkt des Schreibens des Artikels habe ich ihn "post" gemacht und er wurde zu "post v1_posts_url, params: post", und der Beitrag von get und post wurde überschrieben und der Test funktionierte nicht richtig ... Die Lösung dauerte lange: sweat_smile:
expect do post v1_posts_url, params: new_post end.to change { Post.count }.by(1)
Dieser Block ist ein Test, bei dem Post.count durch Posten um 1 erhöht wird. Der Punkt ist, dass Expect ein Block anstelle von "Expect.to Gl." Ist.
Controller implementieren.
app/controllers/v1/posts_controller.rb
...
def create
- # TODO
+ post = Post.new(post_params)
+ if post.save
+ render json: { post: post }
+ else
+ render json: { errors: post.errors }
+ end
end
...
$ curl localhost:8080/v1/posts -X POST -H 'Content-Type: application/json' -d '{"subject":"moge","body":"hoge"}'
{"post":{"id":3,"subject":"moge","body":"hoge","created_at":"2020-09-06T10:31:38.375Z","updated_at":"2020-09-06T10:31:38.375Z"}}
Wenn rubocop und rspec normal funktionieren, legen Sie fest.
Ich habe es als Referenz in diesem Artikel verwendet. Vielen Dank. Referenz: Super einfache API mit Schienen
Recommended Posts