Ich werde es ab Werk reparieren.
Derjenige, der am meisten fliegt
ActiveRecord::RecordInvalid:
Validation failed: User must exist
Das ist der Fehler.
Dies geschieht, wenn user_id null wird, wenn create (: post)
fertig ist.
Lassen Sie es uns zerstören, indem Sie die Fabrik modifizieren.
spec/factories/posts.rb
factory :post do
subject { "MyString" }
body { "MyText" }
+
+ after(:build) do |obj|
+ obj.user = build(:user) if obj.user.nil?
+ end
end
after (: build)
wird nach build oder create ausgeführt.
Sie können den Fehler "Benutzer muss vorhanden sein" beseitigen, indem Sie den erstellten Benutzer in post.user einfügen.
Wenn Sie "if obj.user.nil?" Ausführen und einen bestimmten Benutzer wie "create (: post, user: user)" übergeben und erstellen, können Sie außerdem verhindern, dass er durch interne Verarbeitung überschrieben wird. Ich werde.
Auf einfachere Weise können die meisten von ihnen vorerst zerkleinert werden.
spec/factories/posts.rb
factory :post do
subject { "MyString" }
body { "MyText" }
+ user
end
Diese Methode ist jedoch gut, wenn "create (: post)" ausgeführt wird. Da der Benutzer jedoch mit "nil" zurückkehrt, wenn "build (: post)" ausgeführt wird, wird die erstere unterstützt.
spec/requests/v1/posts_request_spec.rb
describe "POST /v1/posts#create" do
+ let(:authorized_headers) do
+ user = create(:user)
+ post v1_user_session_url, params: { email: user.email, password: "password" }
+ headers = {}
+ headers["access-token"] = response.header["access-token"]
+ headers["client"] = response.header["client"]
+ headers["uid"] = response.header["uid"]
+ headers
+ end
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
+ post v1_posts_url, params: new_post, headers: authorized_headers
expect(response.status).to eq 200
end
it "Ein weiterer Fall wird zurückgesandt" do
expect do
- post v1_posts_url, params: new_post
+ post v1_posts_url, params: new_post, headers: authorized_headers
end.to change { Post.count }.by(1)
end
it "subject,Körper kehrt korrekt zurück" do
- post v1_posts_url, params: new_post
+ post v1_posts_url, params: new_post, headers: authorized_headers
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: {}
+ post v1_posts_url, params: {}, headers: authorized_headers
json = JSON.parse(response.body)
expect(json.key?("errors")).to be true
end
end
Generieren Sie einen Benutzer und melden Sie sich basierend auf diesen Benutzerinformationen an. Durch Hinzufügen der 3 Schlüssel zur Authentifizierung im Antwortheader zu den Headern und zum Posten können Sie zugreifen, während Sie als Benutzer "create (: user)" authentifiziert werden. Da die Controllerseite jedoch noch nicht repariert wurde, bleibt es ein Fehler.
app/controllers/v1/posts_controller.rb
def create
- post = Post.new(post_params)
+ post = current_v1_user.posts.new(post_params)
if post.save
Das obige Update sollte den Test bestehen.
Um das Verhalten zu erklären, kann der Controller zunächst die Methode current_v1_user
verwenden, da die Authentifizierungsinformationen von Headern übergeben werden. Dadurch wird die angemeldete Benutzerinstanz zurückgegeben.
Mit anderen Worten, "current_v1_user.posts.new" instanziiert den Beitrag, der dem angemeldeten Benutzer zugeordnet ist.
Dadurch wird ein Beitrag für den angemeldeten Benutzer erstellt.
Der Test ist bestanden, aber wenn Sie bei der zukünftigen Implementierung von Pundit und der Autorisierung den Prozess schreiben, um den authentifizierten Header jedes Mal abzurufen, nimmt die Wartbarkeit ab. Wechseln Sie daher zur Spezifikation zum Helfer. Ich werde.
Der Helfer für spec befindet sich normalerweise in spec / support. Erstellen Sie daher ein Verzeichnis.
$ mkdir spec/support
$ touch spec/support/authorization_spec_helper.rb
Ich werde die für rspec geeignete Verarbeitung an diesen Ort bringen.
spec/support/authorization_spec_helper.rb
# frozen_string_literal: true
#
#Helfer für die Authentifizierung
#
module AuthorizationSpecHelper
def authorized_user_headers
user = create(:user)
post v1_user_session_url, params: { email: user.email, password: "password" }
headers = {}
headers["access-token"] = response.header["access-token"]
headers["client"] = response.header["client"]
headers["uid"] = response.header["uid"]
headers
end
end
Wenn Sie es nur unter spec / support platzieren, wird es nicht von selbst gelesen. Ändern Sie daher spec / rails_helper.rb.
spec/rails_helper.rb
-# Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
+Dir[Rails.root.join("spec", "support", "**", "*.rb")].sort.each { |f| require f }
...
RSpec.configure do |config|
...
+ config.include(AuthorizationSpecHelper, type: :request)
end
Aktivieren Sie den auskommentierten Lesevorgang unter spec / support und schließen Sie AuthorizationSpecHelper ein. Wenn Sie wie oben schreiben, ist nur die Anforderungsspezifikation gültig.
spec/requests/v1/posts_request_spec.rb
...
require "rails_helper"
RSpec.describe "V1::Posts", type: :request do
+ let(:authorized_headers) do
+ authorized_user_headers
+ end
...
describe "POST /v1/posts#create" do
- let(:authorized_headers) do
- user = create(:user)
- post v1_user_session_url, params: { email: user.email, password: "password" }
- headers = {}
- headers["access-token"] = response.header["access-token"]
- headers["client"] = response.header["client"]
- headers["uid"] = response.header["uid"]
- headers
- end
...
Der Rest wird mit der obigen Korrespondenz abgeschlossen. Wenn das Testergebnis grün bleibt, ist es vorerst in Ordnung.
Alle Tests bestehen, aber der Testcode ist in erster Linie unzureichend. Wenn Sie auf #create klicken, wenn Sie nicht authentifiziert sind, wird ein Fehler von 500 angezeigt, und die aktuellen Spezifikationen, mit denen Sie andere Beiträge als Sie selbst aktualisieren oder löschen können, sind problematisch. Daher werde ich beim nächsten Mal endlich die Autorisierung hinzufügen.
Nächstes Mal werden wir den Samen pflegen. Das ist alles für heute.
→ Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 14 Anzeigen der Anzeige der Ausführungszeit [Zur Serialisierungstabelle]
Recommended Posts