Implementieren Sie die Validierung und das Testen für den Benutzer. Es ist nicht mehr Test-First, aber da das Gerät etwas Besonderes ist, wollte ich es so weit implementieren, dass es funktioniert, sodass die Reihenfolge nicht in Ordnung ist.
Bereiten Sie zunächst die für den Test erforderlichen Dateien vor. Das Benutzermodell wurde mit devise_token_auth generiert, sodass die Dateien rspec und factoryBot fehlen. Generieren Sie mit dem folgenden Befehl.
$ rails g rspec:model user
create spec/models/user_spec.rb
invoke factory_bot
create spec/factories/users.rb
Erstellen Sie zuerst die Fabrik.
spec/factories/users.rb
# frozen_string_literal: true
FactoryBot.define do
factory :user do
provider { "email" }
sequence(:email) { |n| "test#{n}@example.com" }
uid { email }
password { "password" }
remember_created_at { nil }
name { "MyString" }
tokens { nil }
end
end
Was ist mit den Spalten in der Benutzertabelle passiert? Anschließend können Sie das Ausgabeergebnis überprüfen, indem Sie sich db / schema.rb ansehen.
In der Factory-Datei sind drei Punkte zu beachten.
sequence(:email) { |n| "test#{n}@example.com" } uid { email } password { "password" }
Das sind drei.
sequence(:email) { |n| "test#{n}@example.com" }
In n
dieses Vorgangs wird eine Seriennummer eingegeben. Der erste Datensatz ist [email protected], der zweite Datensatz ist test2 @ example.com,….
Der Grund dafür ist, dass die E-Mail-Spalte eindeutig eingeschränkt ist und nicht registriert werden kann, wenn es sich um dieselbe Zeichenfolge handelt. Wenn dies beispielsweise eine konstante E-Mail-Adresse {"[email protected]"} ist, führt "create_list (: user, 10)" zu zwei oder mehr entsprechenden E-Mail-Adressen und Moos.
uid { email }
Es ist nur eine einfache UID mit einer E-Mail-Variablen.
Das Verhalten von devise ist uid = email, wenn der Provider E-Mail ist.
password { "password" }
Das encrypted_password befindet sich in der DB-Spalte, aber die Hash-Zeichenfolge wird dort gespeichert.
Der Spaltenname stimmt nicht mit schema.rb überein, da Sie beim Festlegen des Kennworts einen Wert für das Kennwort eingeben müssen.
Ich möchte einen Test ähnlich dem von post ausführen, also kopiere spec / models / post_spec.rb. Ersetzen Sie "Post" durch "Benutzer", "Betreff" durch "Name" und "Körper" durch "E-Mail".
spec/models/user_spec.rb
# frozen_string_literal: true
require "rails_helper"
RSpec.describe User, type: :model do
describe "name" do
context "Wenn leer" do
let(:user) do
build(:user, name: "")
end
it "Ungültig werden" do
expect(user).not_to be_valid
end
end
context "durch maximale Länge" do
context "Für 30 Zeichen" do
let(:user) do
build(:user, name: "Ah" * 30)
end
it "Werden Sie gültig" do
expect(user).to be_valid
end
end
context "Für 31 Zeichen" do
let(:user) do
build(:user, name: "Ah" * 31)
end
it "Ungültig werden" do
expect(user).not_to be_valid
end
end
end
end
describe "email" do
context "Wenn leer" do
let(:user) do
build(:user, email: "")
end
it "Ungültig werden" do
expect(user).not_to be_valid
end
end
context "durch maximale Länge" do
context "Für 100 Zeichen" do
let(:user) do
build(:user, email: "@example.com".rjust(100, "a"))
end
it "Werden Sie gültig" do
expect(user).to be_valid
end
end
context "Für 101 Zeichen" do
let(:user) do
build(:user, email: "@example.com".rjust(101, "a"))
end
it "Ungültig werden" do
expect(user).not_to be_valid
end
end
end
context "Per E-Mail-Format" do
context "Wenn die Zeichenfolge korrekt ist" do
let(:user) do
build(:user, email: "[email protected]")
end
it "Werden Sie gültig" do
expect(user).to be_valid
end
end
context "Bei falscher Zeichenfolge" do
let(:user) do
build(:user, email: "test@example")
end
it "Ungültig werden" do
expect(user).not_to be_valid
end
end
end
end
end
Die folgenden Teile werden nicht von der Post kopiert, sondern unabhängig voneinander ersetzt.
build(:user, email: "@example.com".rjust(100, "a"))
build(:user, email: "@example.com".rjust(101, "a"))
rjust ist eine Methode, die die Zeichenfolge mit den angegebenen Zeichen füllt, damit sie rechtsbündig ist. Versuchen Sie es mit "Schienen c".
$ rails c
[1] pry(main)> "@example.com".rjust(100, "a")
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com"
[2] pry(main)> "@example.com".rjust(100, "a").length
=> 100
Auf diese Weise können Sie Dummy-Daten generieren, die für 100 Zeichen perfekt sind.
app/models/user.rb
# frozen_string_literal: true
#
#Benutzerklasse
#
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:rememberable, :validatable
include DeviseTokenAuth::Concerns::User
+ validates :name, presence: true, length: { maximum: 30 }
+ validates :email, presence: true, length: { maximum: 100 }
end
Dies wird den rspec-Test bestehen.
Das? Ich habe die Formatüberprüfung meiner E-Mail-Adresse nicht geschrieben, aber warum ist sie in Ordnung? Wenn Sie es fühlen, ist es scharf.
Da das E-Mail-Format durch das : validatable
des Geräts überprüft wird, ist es im Fall des vom Gerät abhängigen Modells nicht erforderlich, die Bestätigung der Bestätigung des E-Mail-Formats anzugeben.
In diesem Tutorial schreiben wir abschließend einen einfachen Test, für den nur eine Registrierung und ein Login erforderlich sind.
$ rails g rspec:request v1/auth
create spec/requests/v1/auths_spec.rb
$ mv spec/requests/v1/auths_spec.rb spec/requests/v1/auth_spec.rb
Da auths unangenehm ist, benennen Sie es in auth um. Grundsätzlich schreibe ich auth_spec.rb unter Bezugnahme auf spec / request / v1 / posts_spec.rb.
spec/requests/v1/auth_spec.rb
# frozen_string_literal: true
require "rails_helper"
RSpec.describe "V1::Auth", type: :request do
describe "POST /v1/auth#create" do
let(:user) do
attributes_for(:user, email: "[email protected]", name: "Anmeldetest")
end
it "Der normale Antwortcode wird zurückgegeben" do
post v1_user_registration_url, params: user
expect(response.status).to eq 200
end
it "Ein weiterer Fall wird zurückgesandt" do
expect do
post v1_user_registration_url, params: user
end.to change { User.count }.by(1)
end
it "Name wird korrekt zurückgegeben" do
post v1_user_registration_url, params: user
json = JSON.parse(response.body)
expect(json["data"]["name"]).to eq("Anmeldetest")
end
it "Fehler werden zurückgegeben, wenn der Parameter ungültig ist" do
post v1_user_registration_url, params: {}
json = JSON.parse(response.body)
expect(json.key?("errors")).to be true
end
end
describe "POST /v1/auth/sign_in#create" do
let(:user) do
create(:user, email: "[email protected]", name: "Anmeldetest")
{ email: "[email protected]", password: "password" }
end
it "Der normale Antwortcode wird zurückgegeben" do
post v1_user_session_url, params: user, as: :json
expect(response.status).to eq 200
end
it "Name wird korrekt zurückgegeben" do
post v1_user_session_url, params: user
json = JSON.parse(response.body)
expect(json["data"]["name"]).to eq("Anmeldetest")
end
it "Fehler werden zurückgegeben, wenn der Parameter ungültig ist" do
post v1_user_session_url, params: {}
json = JSON.parse(response.body)
expect(json.key?("errors")).to be true
end
end
end
Wenn rubocop und rspec nach dem bisherigen Schreiben normal funktionieren, legen Sie fest.
→ Erstellen einer Bulletin Board-API mit Authentifizierung und Autorisierung in Rails 6 # 12 Zuordnung von Benutzer und Beitrag [Zur Serialisierungstabelle]
Recommended Posts