[RUBY] [Schienen] Test mit RSpec

Einführung

Tests, die ich vermieden habe, weil ich dachte, es wäre schwierig. Ich bin dabei, den Dienst ernsthaft zu starten, daher werde ich in diesem Artikel schreiben, was ich als ersten Schritt gelernt habe, um den Test fest zu verstehen. Es ist ein sogenanntes Memorandum. Da ich selbst Anfänger bin, werde ich aus Anfängersicht schreiben. Ich wäre Ihnen dankbar, wenn Sie einen Kommentar abgeben könnten, wenn es mehr Schreibstile und Methoden wie diese gibt!

Einführung von RSpec

Wir werden die Regeln einführen. Nun, ohne an irgendetwas zu denken

Gemfile


group :development, :test do
  ...Kürzung...
  gem 'rspec-rails'
end

group :development do
  gem 'web-console' #Möglicherweise wurde es ursprünglich aufgeführt.
end


Führen Sie nach dem Bearbeiten der Gemfile die übliche Bundle-Installation durch.

RSpec Grundeinstellungen

Zunächst müssen Sie eine Konfigurationsdatei für RSpec erstellen. Am Terminal

$ rails g rspec:install

Dann wird die folgende Datei generiert.

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

Fügen Sie der ***. Rspec *** -Datei der generierten Dateien Folgendes hinzu.

.rspec


--format documentation

Wenn Sie das oben Gesagte hinzufügen, wird das Testergebnis auf leicht lesbare Weise ausgegeben. Sie können sich vorstellen, dass Sie den Kontext schreiben und dass er später in Phasen herauskommt. Nun, ich denke nicht, dass es ein Problem ohne es ist. Übrigens, wenn Sie andere als die oben genannten Optionen hinzufügen, können Sie auch Text ausgeben und parallel anzeigen. Wenn Sie ihn also haben möchten, überprüfen Sie ihn bitte.

Die Installation ist vorerst abgeschlossen. Es ist die Arbeit, den Testcode von hier aus zu schreiben.

Versuchen Sie, den Test auszuführen

RSpec kann durch Eingabe eines Befehls im Terminal ausgeführt werden. Ich habe noch keinen Testcode geschrieben, aber ich werde den folgenden Code in das Terminal eingeben, um zu sehen, ob er tatsächlich funktioniert.

Terminal


$ bundle exec rspec

Das Obige ist der Befehl zum Ausführen des Tests. Daher ist es in Ordnung, wenn die folgende Anzeige angezeigt wird.

Terminal


No examples found.


Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures

Erstellen Sie von hier aus Testdateien wie Modelle, Controller, Roots und Ansichten und schreiben Sie Testcode.

Unit Test (Modell)

Ziel ist es, Testcode für die Modellvalidierung zu schreiben und auszuführen, bei der es sich um einen Komponententest handelt.

Was Sie im Voraus wissen müssen

Der Testcode erstellt eine Spezifikationsdatei und schreibt sie. Anstatt eine Datei zu erstellen und zu schreiben, platzieren Sie die Spezifikationsdatei zum besseren Verständnis unter spec / models / für die Modelltestdatei und unter spec / controller / für die Controller-Testdatei. Ich werde.

*** Namenskonvention für Spezifikationsdateien *** Die Spezifikationsdatei heißt die entsprechende Klasse name_spec.rb. Dieses Mal testen wir die Validierung des Kontaktformulars (Kontaktmodell / contact.rb), sodass der Name "contact_spec.rb" lautet.

Grundlagen des Testcodes

Nachdem Sie die Datei zum Schreiben des Testcodes kennen, schreiben Sie den Super-Super-Super-Basic-Testcode, bevor Sie ihn tatsächlich schreiben. *** Einfacher Testcode "Stellen Sie sicher, dass 1 + 1 zu 2 wird" ***

sample_spec.rb


describe "hogehoge" do
  it "1 +1 wird 2" do
    expect(1 + 1).to eq 2
  end
end

Ignoriere den Wortschatz und gib meinen eigenen Kommentar ab.

sample_spec.rb



describe "hogehoge" do        #describe(Bedeutung zu erklären)Erstellen Sie eine Gruppe für diesen Test.
  it "1 +1 wird 2" do     #it "~~~"machen~~~Schreiben Sie im Teil, welchen Test dieser Code durchführt
    expect(1 + 1).to eq 2     #Dieser Teil ist die Formel, die prüft, ob der Test tatsächlich erfolgreich ist.
  end
end

Die Formel der obigen Erwartung (1 + 1) zu Gleichung 2 heißt Erwartung. ● expect(X).to eq Y  Wenn der Wert des Ausdrucks im x-Teil gleich dem Wert im Y-Teil ist, ist der Test erfolgreich. Der eq-Teil wird als Matcher bezeichnet.

Ein Matcher ist eine Bedingung, unter der ein Test in einer Spekulation erfolgreich ist. Wie oben erwähnt, bedeutet Gleichung beispielsweise "wenn gleich". Es gibt mehrere andere Matcher, z. B. include (falls enthalten) und valid (falls validiert). Es gibt viele, also verwenden Sie es bitte entsprechend dem Test, den Sie schreiben möchten.

Testen Sie tatsächlich die Validierung des Modells.

Das diesmal verwendete Kontaktmodell (Abfragefunktion) ist wie folgt.

contact.rb



class Contact < ApplicationRecord

#Name des Absenders
  validates :name, presence: true 

#Mead, um auf Anfragen zu antworten
  validates :email, presence: true, length: {maximum:255},
                                    format: {with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i}

#Anfrage Betreff
  validates :title, presence: true

#Inhalt der Anfrage
  validates :message, presence: true
end

Wir werden Testcode für die obige Validierung schreiben.

Erstellen Sie eine Datei spec / models / contact_spec.rb.

Bearbeiten Sie die erstellte contact_spec.rb wie folgt.

contact_spec.rb


require 'rails_helper'
  RSpec.describe Contact, type: :model do
    it "Ohne Namen kann nicht registriert werden" do
  end
end

Die erste Zeile require'rails_helper 'aktiviert allgemeine Einstellungen, indem Sie die Beschreibung in rails_helper.rb lesen. Diese Beschreibung in der ersten Zeile wird jedes Mal in jede Spezifikationsdatei geschrieben.

Führen Sie nach dem Schreiben das Befehlspaket exec rspec im Terminal aus. Ich habe noch keinen Ausdruck geschrieben, der als Test ausgewertet wird, daher besteht der Test bedingungslos. Es ist in Ordnung, wenn es wie folgt aussieht.

Terminal

Terminal


Contact
Ohne Namen kann nicht registriert werden

Finished in 0.23784 seconds (files took 4.71 seconds to load)
1 example, 0 failures

Schreiben Sie einen Testcode, um sicherzustellen, dass Sie sich nicht registrieren können, wenn der Name leer ist

Fügen Sie dem zuvor geschriebenen Testcode Folgendes hinzu.

contact_spec.rb



RSpec.describe Contact, type: :model do
  it "Ohne Namen kann nicht registriert werden" do
    contact = Contact.new(name: "", email: "[email protected]", title: "Über Rücksendungen", message: "Ich möchte den Artikel mit der Bestellnummer 000000000 zurücksenden.")
    contact.valid?
    expect(contact.errors[:name]).to include("Bitte eingeben")
  end
end

*** [3. Zeile] Erstellen Sie eine neue Instanz der Kontaktklasse mit der Eigenschaft, in der Sie testen möchten ***. Ich möchte einen Testcode erstellen, um zu bestätigen, dass "nicht registriert werden kann, wenn der Name leer ist". Daher erstelle ich eine Instanz der Kontaktklasse mit dem Wert des Namens leer und anderen entsprechend festgelegten Werten.

*** [6. Zeile] Überprüfen Sie, ob die in *** erstellte Instanz nicht durch Validierung gespeichert werden kann.

Überprüfen Sie als Ergebnis der Überprüfung mit *** [7. Zeile] ***, ob die Fehleranweisung der Instanz Ihren Erwartungen entspricht. Wenn Sie den Spaltennamen in der Methode zum Abrufen des Hashwerts für contact.errors angeben, können Sie das Array abrufen, das die durch diese Spalte verursachte Fehleranweisung enthält. Zu diesem Zweck erstellen wir eine Ausnahme mit einem Matcher namens include. Dieses Mal wird "Bitte eingeben" in der Validierungsfehleranweisung ausgegeben, sodass der Inhalt beschrieben wird.

Der obige Ablauf hat dieselbe Bedeutung wie die Überprüfung auf der Konsole unten.

Terminal



#Starten Sie die Konsole
$ rails c
#Erstellen Sie eine Instanz der Kontaktklasse mit einem leeren Namenswert
>contact = Contact.new(name: "", email: "[email protected]", title: "Über Rücksendungen", message: "Ich möchte den Artikel mit der Bestellnummer 000000000 zurücksenden.")
#valid?Verwenden Sie die Methode
>contact.valid?
#Verwenden Sie die Fehlermethode
>contact.errors
=> #<ActiveModel::Errors:0x007ffa6ce07ef0
 @base=
  #<Contact:0x007ffa6d3430b8
#Unterlassung
 @messages={:name=>["Bitte eingeben"]}>

Geben Sie nun den Befehl RSpec ein, um den Test auszuführen.

Terminal


$ bundle exec rspec

Wenn Sie das folgende Ergebnis erhalten, sind Sie erfolgreich.

Terminal


Contact
Ohne Namen kann nicht registriert werden

Finished in 0.07346 seconds (files took 2.31 seconds to load)
1 example, 0 failures

Wenn ein Fehler angezeigt wird, wird im Terminal eine Fehlermeldung angezeigt, die häufig durch sorgfältiges Lesen behoben werden kann. Wie oben erwähnt, wird sich Ihr Verständnis ein wenig vertiefen, wenn Sie es einmal als eine Reihe von Flows auf der Konsole überprüfen.

[Um effizient zu sein] Einführung von factory_bot

Ich habe früher einen Testcode geschrieben, aber wenn ich einen Test für eine andere E-Mail als den Namen schreibe, sieht dieser wie folgt aus.

contact_spec.rb



RSpec.describe Contact, type: :model do
  it "Ohne Namen kann nicht registriert werden" do
    contact = Contact.new(name: "", email: "[email protected]", title: "Über Rücksendungen", message: "Ich möchte den Artikel mit der Bestellnummer 000000000 zurücksenden.")
    contact.valid?
    expect(contact.errors[:name]).to include("Bitte eingeben")
  end

  it "Ohne E-Mail kann nicht registriert werden" do
    contact = Contact.new(name: "takashi", email: "", title: "Über Rücksendungen", message: "Ich möchte den Artikel mit der Bestellnummer 000000000 zurücksenden.")     
    contact.valid?
    expect(contact.errors[:email]).to include("Bitte eingeben")
  end
end

Ich entleere einfach den E-Mail-Teil, aber das Erstellen einer Instanz erhöht jedes Mal die Codemenge. *** factory_bot *** verbessert dies.

Was ist factory_bot?

Ein Juwel, mit dem Sie einfach Dummy-Instanzen erstellen können. Legen Sie die für jede Klasseninstanz definierten Eigenschaften im Voraus in einer anderen Datei fest und verwenden Sie die Methode aus der Spezifikationsdatei, um die genaue Instanz zu erstellen.

Wenn Sie factory_bot verwenden, lautet die Beschreibung wie folgt.

contact_spec.rb



RSpec.describe Contact, type: :model do
  it "Ohne Namen kann nicht registriert werden" do
    contact = build(:contact, name: "")
    contact.valid?
    expect(contact.errors[:name]).to include("Bitte eingeben")
  end

  it "Ohne E-Mail kann nicht registriert werden" do
    contact = build(:contact, email: "")      
    contact.valid?
    expect(contact.errors[:email]).to include("Bitte eingeben")
  end
end

Eine Instanz wird im Voraus in einer separaten Datei erstellt und aufgerufen.

Installationsverfahren

*** Gem'factory_bot_rails '*** wurde derselben Umgebung wie rspec-Rails hinzugefügt

Gemfile


group :development, :test do
  #Kürzung
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end

Dann Bundle installieren und Erstellen Sie ein Verzeichnis mit dem Namen "Fabriken" direkt unter dem Spezifikationsverzeichnis. Erstellen Sie darin eine Ruby-Datei mit dem Plural-Dateinamen der erstellten Instanz. In diesem Fall ist es contacts.rb.

Bearbeiten Sie die erstellte Datei contacts.rb wie folgt.

contacts.rb


FactoryBot.define do
  factory :contact do
    name {"takashi"}
    email {"[email protected]"}
    title {"Über Rücksendungen"}
    message {"Ich möchte den Artikel mit der Bestellnummer 000000000 zurücksenden."}
  end
end

Wenn Sie dann eine Instanz erstellen, können Sie eine Instanz mit dem Inhalt der festgelegten Vorlage erstellen, indem Sie Folgendes schreiben.

#factory_Wenn Sie keinen Bot verwenden
contact = Contact.new(name: "", email: "[email protected]", title: "Über Rücksendungen", message: "Ich möchte den Artikel mit der Bestellnummer 000000000 zurücksenden.")
#factory_Bei Verwendung von Bot
contact = FactoryBot.build(:contact)

Es war ziemlich erfrischend. Wenn Sie spec / rails_helper.rb wie folgt bearbeiten, können Sie auch die Beschreibung von FactoryBot der Klasse, die der Empfänger ist, weglassen.

rails_helper.rb


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

  #Kürzung
end

Basierend auf dem oben Gesagten werde ich zusätzlichen Testcode schreiben.

contact_spec.rb



require 'rails_helper'

RSpec.describe Contact, type: :model do
  it "Ohne Namen kann nicht registriert werden" do
    contact = build(:contact, name: "")
    contact.valid?
    expect(contact.errors[:name]).to include("Bitte eingeben")
  end

  it "Ohne E-Mail kann nicht registriert werden" do
    contact = build(:contact, email: "")      
    contact.valid?
    expect(contact.errors[:email]).to include("Bitte eingeben")
  end

  it "@Domain nach der Marke" do
    contact = build(:contact, email: "example@eee")
    contact.valid?
    expect(contact.errors[:email]).to include("Ist ein ungültiger Wert")
  end

  it "Ohne Titel kann nicht registriert werden" do
    contact = build(:contact, title: "")      
    contact.valid?
    expect(contact.errors[:title]).to include("Bitte eingeben")
  end

  it "Ohne Nachricht kann nicht registriert werden" do
    contact = build(:contact, message: "")      
    contact.valid?
    expect(contact.errors[:message]).to include("Bitte eingeben")
  end
end


Dies ist vorerst das ausgefüllte Formular.

Am Ende

Dieses Mal haben wir einen Test zur Validierung des Kontaktmodells durchgeführt. Abhängig von den Spezifikationen der WEB-Anwendung gibt es jedoch verschiedene Möglichkeiten, es zu schreiben. Ich hoffe, es hilft Ihnen, die Welt des Testens so gut wie möglich zu verstehen. Es scheint, dass die Methode zum Testen des Controllers anders sein wird, daher hoffe ich, sie bald zu verbessern.

Als ich den Test ein wenig verstand, kam mir der Gedanke, dass ich bei der Entwicklung der nächsten Anwendung den Testcode schreiben und dann implementieren möchte. Wir würden uns freuen, wenn Sie Korrekturen oder Korrekturen am Inhalt des Artikels kommentieren könnten.

Vielen Dank für das Lesen für eine lange Zeit!

Recommended Posts

[Schienen] Test mit RSpec
[Schienen] Machen wir einen Unit-Test mit Rspec!
Testen Sie Nokogiri mit Rspec.
[Ruby on Rails] Controller-Test mit RSpec
[Ruby on Rails] Modelltest mit RSpec
Testen Sie Active Strage mit RSpec
[Rails] Testcode mit Rspec
Testen Sie den GraphQL-Resolver mit rspec
[Rails] Informationen zum Rspec-Antworttest
[Rails5] Rspec -Einheitentest beim Verschachteln-
Kopieren Sie den Test und fügen Sie ihn mit RSpec ein
Rails Tutorial Test
Rspec Basics [Rails]
[Rails5] Rspec -validierung-
Verstehen Sie die Codeabdeckung mit Rspec, dem Ruby on Rails-Testframework
Ausführung des RSpec-Testcodes
Integrationstest mit Gradle
[Für Anfänger] Testen Sie die Benutzerregistrierung bei RSpec
[Rails 6] Laufzeitfehler mit $ Rails s
Gerät mit Schienen handhaben
[Rails] Lernen mit Rails Tutorial
Einführung in Rspec, ein Testframework für Ruby on Rails
Verwenden Sie Webmock mit Rspec
[Rails] Entwicklung mit MySQL
Automatisch mit Messgerät testen
Lasttest mit JMeter
Rails-Anfänger haben versucht, mit RSpec zu beginnen
Schienen, RSpec-Installationsverfahren
Machen Sie einen Unit-Test mit Junit.
Unterstützt Mehrsprachigkeit mit Rails!
[Rails] Ich möchte mit RSpec testen. Wir unterstützen Ihren Schritt [Einführungsverfahren]
[Schienen] Von der Testvorbereitung zum Modelleinheitentest [RSpec]
Führen Sie Ruby on Rails RSpec-Tests mit GitHub-Aktionen aus
[Rails / RSpec] Schreiben Sie einen Modelltest (mit Shoulda Matchers / FactoryBot)
Rails5 Rspec-Testfehler ArgumentError: Werkseitig nicht registriert: Benutzer
Führen Sie RSpec, Brakeman, Rubocop und Rails Best Practices mit Overcommit aus
Schienen testen db nur fallen
Überprüfen Sie den CSV-Wert mit RSpec
[Rails] Polymorph mit graphql-rubin ausdrücken
[Rails] Videos mit Rails hochladen (ActiveStorage)
[Vue Rails] "Hallo Vue!" Wird mit Vue + Rails angezeigt
[RSpec] Verwenden wir FactoryBot [Rails]
Vorbereitung für die Entwicklung mit Rails
Führen Sie Rails immer im Docker aus
[Docker] Rails 5.2-Umgebungskonstruktion mit Docker
Verwenden Sie mit Rails 6.0 mehrere Datenbanken
[Rails] Geben Sie das Format mit link_to an
[Docker] Wird immer mit Docker + Rails verwendet