[RUBY] Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 11. Benutzermodelltest und Validierung hinzugefügt

Erstellen einer Bulletin Board-API mit Zertifizierungsberechtigung in der Einführung von Rails 6 # 10 devise_token_auth

Vorbereitung auf den Test

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.

Testen des Benutzermodells

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.

Validierungsimplementierung des Benutzermodells

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.

Schreiben Sie eine Anforderungsspezifikation für auth

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.

Fortsetzung

Erstellen einer Bulletin Board-API mit Authentifizierung und Autorisierung in Rails 6 # 12 Zuordnung von Benutzer und Beitrag [Zur Serialisierungstabelle]

Recommended Posts

Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 11. Benutzermodelltest und Validierung hinzugefügt
Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 12 Assoziation von Benutzer und Beitrag
Erstellen Sie eine Bulletin-Board-API mit Zertifizierung und Autorisierung mit Rails 6 # 1 Environment Construction
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6 # 13 Grant-Authentifizierungsheader
# 4 nach Validierung und Testimplementierung zum Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie mit Rails 6 # 18 eine Bulletin-Board-API mit Zertifizierung und Autorisierung. ・ Implementierung des Endbenutzer-Controllers
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung mit Rails 6 # 3 RSpec. FactoryBot wird eingeführt und ein Post-Modell erstellt
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung im Rails 6 # 5-Controller und leiten Sie die Implementierung weiter
Einführung von # 10 devise_token_auth zum Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 2 Einführung in Git und Rubocop
Einführung des Experten Nr. 15 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 17. Fügen Sie Administratorrechte hinzu
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 14 Seed. Anzeige der Ausführungszeit
# 16 Richtlinieneinstellung zum Erstellen einer Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6
# 8 Seed-Implementierung zum Erstellen einer Bulletin Board-API mit Zertifizierungsautorisierung in Rails 6
Einführung des Serializers Nr. 9 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 6. Zeigen Sie, erstellen Sie die Implementierung
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung im Rails 6 # 7-Update und zerstören Sie die Implementierung
So erstellen Sie eine API mit GraphQL und Rails
Ich habe versucht, die Telefonnummer (Festnetz / Mobiltelefon) mit einem regulären Ausdruck in Rails auszudrücken und Validierung und Test zu schreiben
Ich habe versucht, die Rails-API mit TDD von RSpec zu implementieren. Teil2 -Benutzerauthentifizierung-
So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Erstellen Sie eine Windows-Anwendungstestumgebung mit Selenium Grid, Appium und Windows Application Driver
[Rails 6] Registrieren und Anmelden mit Devise + SNS-Authentifizierung (mehrere Links zulässig)
[Rails] Unit-Testcode für das Benutzermodell
[Ruby on Rails] Modelltest mit RSpec
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)