[RUBY] Ich habe einen Unit-Test der Rails-Anwendung mit RSpec und FactoryBot versucht

Überblick

Da haben wir die persönlich entwickelte App getestet, die als Portfolio erstellt wurde Ich möchte auf den Testablauf als persönliche Ausgabe zurückblicken. Dieses Mal wird es der grundlegende Inhalt des Tests sein, der sich auf die Modellvalidierung bezieht.

Annahme

Testen in der Programmierung bedeutet "sicherstellen, dass das Programm wie beabsichtigt funktioniert".

Umgebung

Ruby 2.5.1 Rails 5.2.3

Benutzermodell erstellt mit gem'devise '

Einführung

Installieren Sie zuerst den zum Testen verwendeten Edelstein.

Gem benutzte diesmal

--rspec-Rails ▶ ︎RSpec, ein Juwel für Rails, eine auf Tests spezialisierte Sprache --factory_bot ▶ ︎ Ein Juwel, mit dem Sie einfach eine Dummy-Instanz erstellen können

Gemfile


group :development, :test do
Kürzung

  gem 'factory_bot_rails'
  gem 'rspec-rails'
end

Terminal


$ bundle install

Damit ist die Edelsteininstallation abgeschlossen.

Stellen Sie RSpec ein

Zunächst müssen Sie eine Datei für RSpec generieren. Führen Sie daher den folgenden Befehl aus.

Terminal


$ rails g rspec:install

Dadurch wird die folgende Datei generiert.

Terminal


create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb

Fügen Sie die folgende Beschreibung zu .rspec hinzu

.rspec


--format documentation

Zu diesem Zeitpunkt können Sie den Test mit dem folgenden Befehl ausführen.

Terminal


$ bundle exec rspec

Schreiben Sie einen Testcode für die Modellklasse

Ich schreibe endlich den Testcode Platzieren Sie die Spezifikationsdatei, in der Sie den Testcode schreiben, in dem Verzeichnis mit dem Namen spec, das unterwegs generiert wurde. Da die Modellspezifikationsdatei im Modellverzeichnis zusammengestellt ist, erstellen wir das Verzeichnis und die Datei mit einem Texteditor.

  1. Erstellen Sie ein Verzeichnis mit dem Namen models unter dem Spezifikationsverzeichnis.
  2. Erstellen Sie eine Modellspezifikationsdatei im Verzeichnis spec / models.

** * Die Namenskonvention für Spezifikationsdateien lautet, dass die Spezifikationsdatei den entsprechenden Klassennamen_spec.rb trägt. ** ** **

Dieses Mal gehen wir davon aus, dass wir einen Test zur Validierung des Benutzermodells durchführen. Erstellen Sie daher user_spec.rb.

Zunächst werden wir nacheinander testen, ob jede Validierung zum Zeitpunkt der Registrierung neuer Benutzer angewendet wird. Diesmal erfolgt die Validierung des Benutzermodells unter den folgenden Bedingungen.

app/models/user.rb


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :nickname, :email, :password, :password_confirmation, presence: true
end

Testen Sie die 4 Spalten, auf die das Vorhandensein validiert wird: true wird angewendet.


Testen Sie zunächst die Validierung des Spitznamens mit der Basisbeschreibung.

spec/models/user_spec.rb


require 'rails_helper'
describe User do
  describe '#create' do
    it "Ohne Spitznamen kann nicht registriert werden" do
     user = User.new(nickname: "", email: "[email protected]", password: "1234567", password_confirmation: "1234567")
     user.valid?
     expect(user.errors[:nickname]).to include("can't be blank")
    end
  end
end

In der ersten Zeile wird die Datei beschrieben, die zum Testen gelesen werden soll. Die zweite Zeile beschreibt die Modellklasse. Die dritte Zeile beschreibt den zu testenden Aktionsnamen.

Die Zeichenfolge, die in der 4. bis 8. Zeile endet, ist der Testcode für jede Zeile. Die 4. Zeile beschreibt den zu testenden Inhalt. Die fünfte Zeile beschreibt die Erstellung einer Instanz, wird jedoch mit einer realistischen Annahme beschrieben, mit der Ausnahme, dass der Spitzname leer ist. Wenn Sie in der sechsten Zeile eine gültige? -Methode in die erstellte Instanz schreiben, können Sie beim Speichern einer Instanz einer Klasse, die ActiveRecord :: Base erbt, überprüfen, ob sie nicht durch Validierung gespeichert werden kann. .. Die 7. Zeile beschreibt die erwarteten Testergebnisse für den Inhalt der 6. Zeile. Der Rückgabewert der gültigen? -Methode ist wahr oder falsch. Wenn Sie jedoch die Fehlermethode für eine Instanz verwenden, die die gültige? -Methode verwendet, können Sie überprüfen, warum sie nicht gespeichert werden kann, wenn sie aufgrund der Validierung nicht gespeichert werden kann. In diesem Fall verwenden wir den Include-Matcher unten, um vorherzusagen, dass "eine Fehlermeldung" nicht leer sein kann "erscheint".

Zackri auf Japanisch "Da der Spitzname des Benutzers leer ist, schreiben Sie eine Erwartung, dass Sie den Fehler" Ich kann ihn nicht leeren "erhalten." Es ist wie

Lassen Sie uns den Test hier ausführen

Terminal


$ bundle exec rspec

1 example, 0 failures

Wenn die Meldung "0 Fehler für einen Test" wie oben gezeigt angezeigt wird, ist dies in Ordnung.

Ich werde auch andere Validierungen testen, Mit dem zuerst eingeführten factory_bot kann der Testcode des Teils zur Erstellung der Benutzerinstanz gemeinsam genutzt werden, was sehr praktisch ist.

Verwenden Sie factory_bot

Zuerst erstellen wir ein Verzeichnis namens Fabriken unter dem Spezifikationsverzeichnis. Erstellen Sie eine Datei mit dem Namen users.rb. ** * Dateinamen werden mit mehreren Modellnamen vereinheitlicht **

Beschreiben Sie dann in einer leeren Datei die allgemeinen Teile zum Erstellen einer Modellinstanz.

spec/factories/users.rb


FactoryBot.define do

  factory :user do
    nickname              {"Taro Tanaka"}
    email                 {"[email protected]"}
    password              {"1234567"}
    password_confirmation {"1234567"}
  end

end

Ich muss nichts Besonderes erklären Wenn Sie eine Instanz des Benutzermodells mit dem Testcode erstellen, wird diese jedes Mal mit dem beschriebenen Inhalt ausgeführt.

#Das ist
user = User.new(nickname: "Taro Tanaka", email: "[email protected]", password: "1234567", password_confirmation: "1234567")
#Dies kann erreicht werden
user = FactoryBot.build(:user)

Was für eine weitere Vereinfachung dieses Codes. Es gibt eine Beschreibung zu lesen'rails_helper'in user_spec.rb, Nehmen Sie einige Änderungen in dieser Datei rails_helper.rb vor.

spec/rails_helper.rb


#Kürzung
RSpec.configure do |config|
  #Folgende Beschreibung wurde hinzugefügt
  config.include FactoryBot::Syntax::Methods

  #Kürzung

end

Jetzt können Sie loslegen. Dann ...

#Das ist
user = User.new(nickname: "Taro Tanaka", email: "[email protected]", password: "1234567", password_confirmation: "1234567")
#Dies kann erreicht werden
user = FactoryBot.build(:user)
#Kann weiter weggelassen werden
user = build(:user)

Die Menge an Code wird erheblich reduziert ...

Als ich davon erfuhr, habe ich Werte in alle Spalten eingefügt. Kann ich beim Testen der Validierung leere Spalten reproduzieren? Es gab eine Frage ➡︎ Sie können es ohne Probleme tun

Schauen wir uns den Rest des Testcodes an.

spec/models/user_spec.rb


require 'rails_helper'

describe User do
  describe '#create' do
    it "Ohne Spitznamen kann nicht registriert werden" do
      user = build(:user, nickname: "")
      user.valid?
      expect(user.errors[:nickname]).to include("can't be blank")
    end

    it "Ohne E-Mail kann nicht registriert werden" do
      user = build(:user, email: "")
      user.valid?
      expect(user.errors[:email]).to include("can't be blank")
    end
    
    it "Ohne Passwort kann nicht registriert werden" do
      user = build(:user, password: "")
      user.valid?
      expect(user.errors[:password]).to include("can't be blank")
    end

    it "Passwort auch wenn Passwort existiert_Kann nicht ohne Bestätigung registriert werden" do
      user = build(:user, password_confirmation: "")
      user.valid?
      expect(user.errors[:password_confirmation]).to include("doesn't match Password")
    end
    
    it "Kann nicht registriert werden, wenn das Passwort 5 Zeichen oder weniger enthält" do
      user = build(:user, password: "00000", password_confirmation: "00000")
      user.valid?
      expect(user.errors[:password]).to include("is too short (minimum is 6 characters)")
    end

    #Wir führen auch Tests durch, wenn eine Registrierung möglich ist
    it "Spitzname und E-Mail, Passwort und Passwort_Wenn eine Bestätigung vorliegt, können Sie sich registrieren" do
      user = build(:user)
      expect(user).to be_valid
    end

    it "Sie können sich registrieren, wenn das Passwort aus 6 Zeichen oder mehr besteht" do
      user = build(:user, password: "000000", password_confirmation: "000000")
      user.valid?
      expect(user).to be_valid
    end
  end
end

Die obige Erklärung

user = build(:user)
user = build(:user, nickname: "")

Indem Sie den Spaltennamen und den Wert erneut wie in der zweiten Zeile angeben Sie können den voreingestellten Wert überschreiben. In diesem Beispiel wird der Spitzname: "Ichiro Tanaka" mit dem Spitznamen "" überschrieben. Auf diese Weise können Sie den voreingestellten Wert flexibel ändern (Null ist ebenfalls akzeptabel).

it "Passwort auch wenn Passwort existiert_Kann nicht ohne Bestätigung registriert werden" do
      user = build(:user, password_confirmation: "")
      user.valid?
      expect(user.errors[:password_confirmation]).to include("doesn't match Password")
    end

Das obige enthält auch einen Matcher-Teil Wie "kann nicht leer sein" Die Fehlermeldung "stimmt nicht mit Passwort überein" Wo kommen Sie her? Ich denke darüber nach, so etwas zu schreiben Wenn Sie es von Anfang an nicht wissen, können Sie die Fehlermeldung nicht vorhersagen ...?

Es gab eine Zeit, in der ich das dachte ** (Hinweis: Ich bin noch ein Anfänger) **


Obwohl diese Fehlermeldungen ursprünglich von Rails Gem bereitgestellt wurden Letztendlich können Sie den Test trotzdem ausführen

.to include("")

Anschließend wird das Ergebnis der Testausführung im Terminal angezeigt. Sie haben erwartet, dass die Fehlermeldung "" angezeigt wird, aber die eigentliche Fehlermeldung lautete "stimmt nicht mit dem Kennwort überein"! Wird zurückgegeben.

Dann Ah! Ja ja! Das wollte Wai im Test schreiben! Du verstehst

Sie können auch die Konsole öffnen, um den Ablauf zu überprüfen und zu bestätigen. Wenn der Testaufwand für persönlich entwickelte Apps für Anfänger gering ist, halte ich diese Methode für ausreichend. (Sieht wütend aus)

Die letzten beiden Tests sind auch Tests, bei denen eine Benutzerregistrierung möglich ist. Es gibt einen be_valid-Matcher. Dies wird verwendet, wenn Sie sagen "Es werden alle Validierungen gelöscht".

Versuchen Sie schließlich, den Test auszuführen

Terminal


$ bundle exec rspec

7 example, 0 failures

Wenn die Anzahl der Fehler für die Anzahl der Tests 0 ist, ist dies in Ordnung.

Zusammenfassung

Mit RSpec und FactoryBot habe ich auf einen einfachen Modelltest von Rails zurückgegriffen. Der Test, den ich dieses Mal durchgeführt habe, ist nur ein Teil, aber ich habe den grundlegenden Ablauf und kleine Geschichten geschrieben, also hoffe ich, dass er denjenigen hilft, die neu im Lernen sind.
Wenn Sie Unzulänglichkeiten im Inhalt feststellen, teilen Sie uns dies bitte mit. Abschließend möchte ich den Qiita-Artikel erwähnen, auf den ich mich während meines Studiums bezog. Vielen Dank.

Referenzartikel

Recommended Posts

Ich habe einen Unit-Test der Rails-Anwendung mit RSpec und FactoryBot versucht
Über App-Tests RSpec (Unit Test)
[RSpec] Unit Test (mit gem: factory_bot)
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
[Schienen] Von der Testvorbereitung zum Modelleinheitentest [RSpec]
[Rails / RSpec] Schreiben Sie einen Modelltest (mit Shoulda Matchers / FactoryBot)
Ich habe versucht, YOLO v4 unter Ubuntu und ROS zu verwenden
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
[RSpec] Verwenden wir FactoryBot [Rails]
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe Rails Anfänger ausprobiert [Kapitel 1]
[Rails] Testcode mit Rspec
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe Rails Anfänger ausprobiert [Kapitel 2]
Ich habe versucht, Docker und Maven / Netbean mit Jib gut zu integrieren
Ich habe versucht, eine einfache Anwendung mit Dockder + Rails Scaffold zu erstellen
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Rails Buchbesprechung App RSpec Einführung
Ich habe versucht, JOOQ mit Gradle zu verwenden
[Rails] Ich habe versucht, die Anwendung zu löschen
[Rails5] Rspec -Einheitentest beim Verschachteln-
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe versucht, Pari GP Container zu verwenden
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
Ich habe versucht, Java Memo LocalDate zu verwenden
[Schienen] Machen wir einen Unit-Test mit Rspec!
Ich habe versucht, Google HttpClient von Java zu verwenden
Rails-API-Modus Ich habe versucht, die Mehrfachsuchfunktion für Schlüsselwörter mithilfe von Arrays und iterativer Verarbeitung zu implementieren.
Ich habe WSL2 + Ubuntu in Window10 eingeführt und versucht, GDC, DMD, LDC zu verwenden
Ich habe mit Thymeleaf meinen eigenen Dialekt erstellt und eingestellt und versucht, ihn zu verwenden
Ich habe versucht, mit OpenTrip Planner und GTFS eine eigene Übertragungsanleitung zu erstellen
Umleitung und Komponententest mit dem Spring Flash-Zielfernrohr
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe versucht, Realm mit Swift UI zu verwenden
Führen Sie RSpec ein und schreiben Sie den Unit-Test-Code
Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Es ist neu, aber ich habe versucht, Groonga zu verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Hinweis beim Erstellen einer Viele-zu-Viele-Factory mit Rspec und Testen mit SystemSpec [RSpec, FactoryBot]
Ich habe versucht, "nifty cloud mobile backend" und "Firebase" -Authentifizierung auf Kotlin + Android zu verwenden
[JDBC ③] Ich habe versucht, mithilfe von Platzhaltern und Argumenten Eingaben über die Hauptmethode vorzunehmen.