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.
Testen in der Programmierung bedeutet "sicherstellen, dass das Programm wie beabsichtigt funktioniert".
Ruby 2.5.1 Rails 5.2.3
Benutzermodell erstellt mit gem'devise '
Installieren Sie zuerst den zum Testen verwendeten Edelstein.
--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.
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
.rspec
--format documentation
Terminal
$ bundle exec rspec
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.
** * 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.
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.
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.
Recommended Posts