Dies ist der vorherige Artikel [[2nd] RSpec-Anfänger schrieb SystemSpec als Anfänger (Swamp Edition)](https://qiita.com/komaitaira/items/b9efc86cde48fb5ca8ef "[2nd] RSpec-Anfänger Es ist jedoch eine Fortsetzung von "Ich habe SystemSpec als Anfänger geschrieben (Numa Edition)") und es ist die endgültige Version von SystemSpec (Systemspezifikation).
Wenn Sie mehr über ModelSpec erfahren möchten, lesen Sie bitte hier. ..
Außerdem wurde neulich eine Lernsitzung für Anfänger (RSpec Beginners !!) mit der Freundlichkeit des RSpec-Mannes Junichi Ito @jnchito abgehalten. Ich habe auch an "RSpec Beginners !!") teilgenommen, daher denke ich, dass Sie Ihr Verständnis vertiefen können, indem Sie sich dieses Video ansehen. Schauen Sie also bitte nach, wenn Sie möchten.
** Ziel **
Ich versuche RSpec zu schreiben, bin mir aber nicht sicher, was es ist ~: umarmen: Für Anfänger.
Mr. Itos [Einführung in RSpec, das verwendet werden kann, Teil 1 "Grundlegende Syntax und nützliche Funktionen von RSpec verstehen"](https://qiita.com/jnchito/items/42193d066bd61c740612 "Einführung in RSpec, das verwendet werden kann, Teil 1" Verstehen Sie die grundlegende Syntax und die nützlichen Funktionen von RSpec "")
Es ist wünschenswert, die Rolle der Beschreibung zu verstehen, zumindest zu erwarten, beispielsweise den Inhalt dieses Artikels in gewissem Umfang zu betrachten oder etwas getan zu haben.
** Referenzcode ** Wie oben erwähnt, werde ich es unter Bezugnahme auf mein eigenes Portfolio beschreiben, daher werde ich hier den GitHub-Link veröffentlichen, aber das Testziel ist die Site Bitte beachten Sie, dass wir uns auf Kernfunktionen konzentrieren. ** [Kernfunktionen der Website] ** (Neue Registrierung / Anmeldung / Bearbeitung von Einzelpersonen / Unternehmensmitgliedern, Antrag auf Registrierung von Unternehmensmitgliedern, Veröffentlichung / Bearbeitung von Artikeln, DM, Benachrichtigung usw.)
** Vorbereitung zum Schreiben von Tests ** Um einen Test mit RSpec zu schreiben, müssen einige Edelsteine eingefügt und gesetzt werden, einschließlich gem'rspec-Rails '. Bitte bereiten Sie sich darauf vor, den Test zuerst zu schreiben und dann zu lesen. Was Sie benötigen, wird in "Alltägliche Rails-Einführung in Rails-Tests mit RSpec" beschrieben. Oder besser gesagt, wenn Sie sich das ansehen, können Sie es verstehen, ohne diesen Artikel zu lesen. Wenn Sie den Code als konkretes Beispiel sehen möchten, lesen Sie ihn bitte so wie er ist. (Es ist wirklich nur als Referenz)
Bereiten Sie die vorläufigen Daten mit dem bekannten FactoryBot vor. Es wurde zum Zeitpunkt von Teil 1 erstellt, wird jedoch auch beim Schreiben von Systemspezifikationen verwendet, sodass es unten als Referenz aufgeführt ist. Einzelheiten zu FactoryBot finden Sie im Artikel zu den Modellspezifikationen.
①spec/factories/articles.rb
FactoryBot.define do
#Verwenden Sie FactoryBot und bereiten Sie Artikeldaten im Voraus vor
FactoryBot.define do
factory :article do
title { "Testtitel" }
body { "Testkörper" }
is_active { true }
company
genre
end
end
Schreiben wir nun den Testcode. Wenn Sie $ rails g rspec: system articles ausführen, wird articles_spec.rb im Ordner spec / system erstellt. Der Testcode (tatsächliche Bewegung im Browser usw.) wird in diese Datei geschrieben. Unten finden Sie ein vollständiges Beispiel.
②spec/system/articles_spec.rb
require 'rails_helper'
RSpec.describe "Articles", type: :system do
describe 'Artikelprüfung' do
let(:company){FactoryBot.create(:company)}
let(:genre){FactoryBot.create(:genre)}
let!(:article){FactoryBot.create(:article, company: company, genre: genre)}
before do
visit new_company_session_path
fill_in 'Mail Adresse', with: company.email
fill_in 'Passwort', with: company.password
click_button 'Einloggen'
end
describe 'Sidebar-Test' do
context 'Überprüfen Sie die Anzeige' do
it 'Die Artikelsuche wird angezeigt' do
expect(page).to have_content "Artikelsuche"
expect(current_path).to eq corporate_articles_path
end
it 'Die Artikelregistrierung wird angezeigt' do
expect(page).to have_content "Artikelregistrierung"
expect(current_path).to eq corporate_articles_path
end
end
end
describe 'Post-Test' do
context 'Übergang zur neuen Artikelposting-Seite' do
it 'Überleitung' do
click_on 'Registrieren Sie einen Artikel'
expect(page).to have_content "Neuen Artikel posten"
expect(current_path).to eq new_corporate_article_path
end
end
context 'Überprüfen Sie die Anzeige' do
before do
visit new_corporate_article_path
end
it 'Das obere Bild des Artikels wird angezeigt' do
expect(page).to have_field 'article[image]'
end
it 'Das Genre-Auswahlfeld wird angezeigt' do
expect(page).to have_select 'Genre'
end
it 'Ein Auswahlfeld für den Listenstatus wird angezeigt' do
expect(page).to have_select 'Buchungsstatus'
end
it 'Das Artikeltitelformular wird angezeigt' do
expect(page).to have_field 'Artikelüberschrift'
end
it 'Das Formular für den Artikelinhalt wird angezeigt' do
expect(page).to have_field 'Artikelinhalt'
end
it 'Die Schaltfläche zum Posten von Artikeln wird angezeigt' do
expect(page).to have_button 'Artikel posten'
end
end
context 'Artikel posten' do
before do
visit new_corporate_article_path
end
it 'Erfolgreiches Posten' do
select "Testgenre", from: 'Genre'
select "Jetzt gepostet", from: 'Buchungsstatus'
fill_in 'Artikelüberschrift', with: "RSpec ist schwierig"
fill_in 'Artikelinhalt', with: "Es ist schwierig, aber ich bin froh, wenn die Testsuite durchläuft und alles grün wird."
click_button "Artikel posten"
expect(page).to have_content "Ich habe einen neuen Artikel gepostet."
end
it 'Buchung schlägt fehl' do
fill_in 'Artikelüberschrift', with: ""
click_button "Artikel posten"
expect(page).to have_content "Der Artikel wurde aufgrund des Fehlers nicht gespeichert."
end
end
end
describe 'Test bearbeiten' do
context 'Bestätigung des Übergangs zu jedem Bildschirm' do
it 'Sie können zum Bildschirm mit den Artikeldetails wechseln' do
click_on article.title
expect(page).to have_content "Artikeldetails"
expect(current_path).to eq corporate_article_path(article)
end
it 'Sie können zum Artikelbearbeitungsbildschirm wechseln' do
visit corporate_article_path(article) #Übergang zum Artikeldetails-Bildschirm
click_on "Bearbeiten"
expect(page).to have_content "Bearbeitung von Artikelinformationen"
expect(current_path).to eq edit_corporate_article_path(article)
end
end
context 'Bestätigung der Anzeige und Bearbeitung' do
before do
visit edit_corporate_article_path(article)
end
it 'Das obere Bild des Artikels wird angezeigt' do
expect(page).to have_field 'article[image]'
end
it 'Das Genre-Auswahlfeld wird angezeigt' do
expect(page).to have_select('Genre', selected: 'テストGenre')
end
it 'Ein Auswahlfeld für den Listenstatus wird angezeigt' do
expect(page).to have_select('Buchungsstatus', selected: 'Jetzt gepostet')
end
it 'Das Artikeltitelformular wird angezeigt' do
expect(page).to have_field 'Artikelüberschrift', with: article.title
end
it 'Das Formular für den Artikelinhalt wird angezeigt' do
expect(page).to have_field 'Artikelinhalt', with: article.body
end
it 'Die Schaltfläche zum Bearbeiten von Artikeln wird angezeigt' do
expect(page).to have_button 'Speichern Sie Ihre Änderungen'
end
it 'Erfolgreiche Bearbeitung' do
select "Posting ausgesetzt"
fill_in 'Artikelüberschrift', with: "Ich werde aufhören zu posten, bis ich RSpec reibungslos schreiben kann"
click_button 'Speichern Sie Ihre Änderungen'
expect(page).to have_content 'Die Aktualisierung der Artikelinformationen ist abgeschlossen.'
expect(page).to have_content '[Aktueller Veröffentlichungsstatus: Veröffentlichung ausgesetzt]'
expect(current_path).to eq corporate_article_path(article)
end
it 'Die Bearbeitung schlägt fehl' do
fill_in 'Artikelüberschrift', with: ""
click_button 'Speichern Sie Ihre Änderungen'
expect(page).to have_content "Der Artikel wurde aufgrund des Fehlers nicht gespeichert."
end
end
end
end
end
Wie ich in den Modellspezifikationen erklärt habe, wird der Artikel veröffentlicht ⑴ Es gibt eine Firma, ⑵ Es gibt ein Artikelgenre, ⑶ Artikel können veröffentlicht werden Es ist ein Fluss geworden. Daher können Sie verstehen, dass ein Unternehmen existiert, und es ist erforderlich, ein Genre im Voraus auszuwählen, um einen Artikel zu veröffentlichen. Beachten Sie, dass der Unterschied zum letzten Mal darin besteht, dass die von FactoryBot erstellten Daten mit let und nicht mit der Instanzvariablen gespeichert werden.
②spec/system/articles_spec.rb
context 'Artikel posten' do
before do
visit new_corporate_article_path
end
it 'Erfolgreiches Posten' do
select "Testgenre", from: 'Genre' # セレクトボックスからGenreを選択
select "Jetzt gepostet", from: 'Buchungsstatus' # セレクトボックスからBuchungsstatus(Jetzt gepostet or 掲載停止中)wählen
fill_in 'Artikelüberschrift', with: "RSpec ist schwierig" #Titel eingeben
fill_in 'Artikelinhalt', with: "Es ist schwierig, aber ich bin froh, wenn die Testsuite durchläuft und alles grün wird." # Artikelinhaltを入力
click_button "Artikel posten" # Artikel postenボタンを押下
expect(page).to have_content "Ich habe einen neuen Artikel gepostet."
end
it 'Buchung schlägt fehl' do
fill_in 'Artikelüberschrift', with: ""
click_button "Artikel posten"
expect(page).to have_content "Der Artikel wurde aufgrund des Fehlers nicht gespeichert."
end
end
Im obigen Codebeispiel wechseln wir zunächst zu der Seite, auf der das Post-Formular im Vorher-Block angezeigt wird. Als nächstes Post-Formular 1. Genre auswählen, 2. Posting-Status auswählen, 3. Titel eingeben, 4. Artikelinhalt eingeben und die Post-Taste drücken.
** Stolperpunkt: Umarmen: "Auswahlfeld auswählen" ** In der Auswahl des obigen Auswahlfelds wird es als "Auswahl" Testgenre "beschrieben, aus:" Genre ". Vielleicht ist es kein Stolperstein, wenn Sie es normal machen, aber ich hatte auch hier große Probleme, also werde ich es teilen. Die Ursache für das Stolpern war, dass das ** Etiketten-Tag nicht richtig geschrieben wurde ** und ich das Auswahlfeld nicht gut auswählen konnte. Hier erfahren Sie, wie Sie mein falsches Etikett schreiben.
Ruby:corporate/articles/new.html.erb
<%= f.label :Genre%><br>
<%= f.collection_select :genre_id, Genre.all, :id, :genre_name, include_blank: "--Bitte auswählen--" %>
Die Beschreibung von <% = f.label: Genre%>
ist falsch.
Es wird problemlos im Browser angezeigt, aber wenn ich es mit dem Verifikationstool überprüfe
Aus irgendeinem Grund ist das Attribut for eine Mischung aus Englisch und Japanisch (for = "article_genre"), z. B. "
Ruby:corporate/articles/new.html.erb
<%= f.label :genre_id, "Genre" %><br>
<%= f.collection_select :genre_id, Genre.all, :id, :genre_name, include_blank: "--Bitte auswählen--" %>
** Hinzugefügt am 2. Oktober 2020 ** In Bezug auf das Schreiben des obigen Label-Tags scheint es besser zu sein, die übersetzte Version in eine YAML-Datei einzufügen und in der Ansicht anzuzeigen, als sie in Form eines "Genres" fest in die Ansicht zu schreiben. Ich werde es einmal so beschreiben, aber ich werde es später beheben.
Die Anzeige mit dem Überprüfungstool lautet "
Anstatt den Test zu beschreiben, mag es ein einfacher Teil sein, weil die Ansicht an erster Stelle falsch geschrieben wurde, aber als ich in den Kommentaren des zweiten Artikels Ratschläge erhielt, verstand ich schließlich die Ursache.
Es gibt vielleicht nicht viele Leute, die damit zu kämpfen haben, aber vorerst dieser Artikel [HTML] Warum sollten Sie das Attribut for zum lavel-Tag hinzufügen? Gründliche Erklärung zur Verwendung! Erläutert das label-Tag im Detail.
Wenn das Attribut ** for einen geeigneten Wert enthält (in diesem Fall genre_id), wird es wahrscheinlich programmgesteuert mit dem Eingabeelement ** verknüpft. Ich habe viel gelernt. Wenn der Test aus irgendeinem Grund nicht wie ich besteht, können Sie ihn mit dem Verifikationstool von Chrome überprüfen!
Der Test, der den Rest der Beiträge nicht besteht, und der Test zum Bearbeiten des Artikels sind im Grunde der gleiche wie zuvor. Schreiben Sie ihn daher bitte unter Bezugnahme auf den vollständigen Code!
Der Test ist endlich vorbei! Dieser DM / Benachrichtigungstest beendet den Kernfunktionstest. geben wir unser Bestes! FactoryBot wird in diesem Test übrigens nicht verwendet. Unten finden Sie ein Beispiel für den vollständigen Code.
①spec/system/rooms_spec.rb
require 'rails_helper'
RSpec.describe "Rooms", type: :system do
let(:user){FactoryBot.create(:user)}
let!(:company){FactoryBot.create(:company)}
describe 'DM-Test' do
before do
visit new_user_session_path
fill_in 'Mail Adresse', with: user.email
fill_in 'Passwort', with: user.password
click_button 'Einloggen'
expect(page).to have_content 'Sie sind jetzt angemeldet.'
end
context 'Überprüfen Sie die Anzeige' do
it 'Sie können zur Expertenliste wechseln' do
click_on 'Experte'
expect(current_path).to eq companies_path
end
it 'Eine Schaltfläche zum Wechseln zum Bildschirm mit den Unternehmensdetails und zum Starten von DM wird angezeigt' do
visit companies_path
click_on 'Test Co., Ltd.'
expect(current_path).to eq company_path(company)
expect(page).to have_content 'Test Co., Ltd.'
expect(page).to have_button 'Starten Sie DM'
end
end
context 'Individuelle Seite: Senden einer Nachricht' do
before do
visit company_path(company) #Wechseln Sie zum Bildschirm mit den Unternehmensdetails
click_on 'Starten Sie DM'
end
it 'Sie können den Chatraum betreten und das Anmeldeformular wird angezeigt' do
expect expect(page).to have_field 'Bitte geben Sie eine Nachricht ein'
end
it 'Kann Nachrichten senden' do
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Test Nachricht'
click_button 'Senden'
expect(page).to have_content 'Test Nachricht'
end
it 'Nach dem Senden einer Nachricht wird der Sendeverlauf zum DM-Listenbildschirm hinzugefügt' do
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Test Nachricht'
click_button 'Senden'
expect(page).to have_content 'Test Nachricht' #Nachrichten im Chatraum
visit rooms_path
expect(page).to have_content 'Test Nachricht' #DM-Listenbildschirmmeldung
expect(page).to have_link 'Nachricht ansehen'
end
end
context 'Unternehmensseite: Nachricht empfangen und senden(Antworten)' do
before do
#Senden Sie eine Nachricht auf der einzelnen Seite
visit company_path(company)
click_on 'Starten Sie DM'
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Test Nachricht'
click_button 'Senden'
logout(user)
#Unternehmensanmeldung
visit new_company_session_path
fill_in 'Mail Adresse', with: company.email
fill_in 'Passwort', with: company.password
click_button 'Einloggen'
expect(page).to have_content 'Sie sind jetzt angemeldet.'
end
it 'Die Anzahl der Benachrichtigungen wird in der Kopfzeile angezeigt' do
expect(page).to have_content '1 Benachrichtigung'
end
it 'Sie können über den Link zum Bildschirm mit der Benachrichtigungsliste wechseln und den Empfang von Nachrichten einzelner Benutzer überprüfen.' do
click_on 'Benachrichtigung'
expect(page).to have_content 'Benachrichtigung'
expect(page).to have_content 'Es gibt eine Nachricht von Test Taro'
end
it 'Sie können den Chatraum über den Link betreten und die empfangene Nachricht wird angezeigt' do
click_on 'Benachrichtigung'
click_on 'Botschaft'
expect expect(page).to have_content 'Test Nachricht'
end
it 'Kann Nachrichten senden' do
click_on 'Benachrichtigung'
click_on 'Botschaft'
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Antwort auf Testnachricht'
click_button 'Senden'
expect(page).to have_content 'Antwort auf Testnachricht'
end
end
end
end
①spec/system/rooms_spec.rb
context 'Individuelle Seite: Senden einer Nachricht' do
before do
visit company_path(company) #Wechseln Sie zum Bildschirm mit den Unternehmensdetails
click_on 'Starten Sie DM'
end
it 'Sie können den Chatraum betreten und das Anmeldeformular wird angezeigt' do
expect expect(page).to have_field 'Bitte geben Sie eine Nachricht ein'
end
it 'Kann Nachrichten senden' do
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Test Nachricht'
click_button 'Senden'
expect(page).to have_content 'Test Nachricht'
end
it 'Nach dem Senden einer Nachricht wird der Sendeverlauf zum DM-Listenbildschirm hinzugefügt' do
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Test Nachricht'
click_button 'Senden'
expect(page).to have_content 'Test Nachricht' #Nachrichten im Chatraum
visit rooms_path
expect(page).to have_content 'Test Nachricht' #DM-Listenbildschirmmeldung
expect(page).to have_link 'Nachricht ansehen'
end
end
Ich denke, es gibt einige besonders schwierige Punkte.
** Im Test 'Kann Nachricht senden' **
fill_in'Enter message 'mit:' Test message'
⇨ Geben Sie die String-Testnachricht in das Textfeld einclick_button'Send'
⇨ Drücken Sie die Senden-Tasterequire (page) .to have_content'test message'
⇨ Bestätigen Sie, dass die Nachricht gesendet wurde, indem Sie die Zeichenfolge" test message "auf derselben Seite erwarten.Es ist ein Fluss geworden.
** Im Test "Nach dem Senden einer Nachricht wird der Übertragungsverlauf zum DM-Listenbildschirm hinzugefügt" **
visit room_path
⇨ Zum DM-Listenbildschirm wechselnerwarten (Seite) .zu_inhalt'Testnachricht'
⇨ Vergewissern Sie sich, dass die neueste Nachricht auf dem DM-Listenbildschirm angezeigt wirdEs ist ein Fluss geworden.
Das Obige ist der DM-Test auf der Einzelseite. Als nächstes möchte ich den Test auf der Unternehmensseite erläutern. Siehe das folgende Codebeispiel.
①spec/system/rooms_spec.rb
context 'Unternehmensseite: Nachricht empfangen und senden(Antworten)' do
before do
#Senden Sie eine Nachricht auf der einzelnen Seite
visit company_path(company)
click_on 'Starten Sie DM'
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Test Nachricht'
click_button 'Senden'
logout(user)
#Unternehmensanmeldung
visit new_company_session_path
fill_in 'Mail Adresse', with: company.email
fill_in 'Passwort', with: company.password
click_button 'Einloggen'
expect(page).to have_content 'Sie sind jetzt angemeldet.'
end
it 'Die Anzahl der Benachrichtigungen wird in der Kopfzeile angezeigt' do
expect(page).to have_content '1 Benachrichtigung'
end
it 'Sie können über den Link zum Bildschirm mit der Benachrichtigungsliste wechseln und den Empfang von Nachrichten einzelner Benutzer überprüfen.' do
click_on 'Benachrichtigung'
expect(page).to have_content 'Benachrichtigung'
expect(page).to have_content 'Es gibt eine Nachricht von Test Taro'
end
it 'Sie können den Chatraum über den Link betreten und die empfangene Nachricht wird angezeigt' do
click_on 'Benachrichtigung'
click_on 'Botschaft'
expect expect(page).to have_content 'Test Nachricht'
end
it 'Kann Nachrichten senden' do
click_on 'Benachrichtigung'
click_on 'Botschaft'
fill_in 'Bitte geben Sie eine Nachricht ein', with: 'Antwort auf Testnachricht'
click_button 'Senden'
expect(page).to have_content 'Antwort auf Testnachricht'
end
end
Dies ist auch nicht besonders schwierig.
Beschreiben Sie zunächst im Vorher-Block bis zu dem Punkt, an dem die einzelne Seite eine Nachricht gesendet und dann das Unternehmen angemeldet hat.
** 'Die Anzahl der Benachrichtigungen wird in der Kopfzeile angezeigt' ** Im Test
require (page) .to have_content '1 Notification'
⇨ Überprüfen Sie nach dem Anmelden, ob in der Kopfzeile die Anzahl der Benachrichtigungen entsprechend der Anzahl der Nachrichten und ein Link zur Benachrichtigungsliste angezeigt wird.
** 'Sie können über den Link zum Benachrichtigungslistenbildschirm wechseln und den Empfang von Nachrichten einzelner Benutzer bestätigen' ** Im Test
require (page) .to have_content'Es gibt eine Nachricht von Test Taro'
⇨ Wenn Sie zum Bildschirm mit der Benachrichtigungsliste wechseln, können Sie überprüfen, von wem die Nachricht stammt.
Alles, was Sie tun müssen, ist, den Chatraum zu betreten, zu überprüfen, ob eine Nachricht kommt, und zu prüfen, ob Sie auch von hier aus eine Nachricht senden (beantworten) können.
Dies ist der DM / Benachrichtigungstest.
Dieses Mal haben wir die Veröffentlichung, Bearbeitung, DM und Benachrichtigungstests von Artikeln nach Systemspezifikationen zusammengefasst. Dies vervollständigt die Systemspezifikationen, die ich in zwei Teilen geschrieben habe! Ich habe es als Rezension von mir selbst geschrieben, aber ich dachte wieder, dass es noch Verbesserungen gibt. Ich möchte kleine Korrekturen vornehmen, damit Anfänger, die dies sehen, nicht sagen: "Was ist das, ich verstehe nicht!".
Anfangs hatte ich viele Probleme mit Dingen, die ich nicht verstand, aber trotzdem die Lernsitzung für Anfänger neulich RSpec Beginners !! Ich konnte selbst mehr Tests schreiben als bei meiner Teilnahme, und wenn ich etwas gefragt werde, kann ich den Leuten ein wenig erzählen.
Wir möchten Herrn Ito (@jnchito) für die Bereitstellung dieser Gelegenheit und allen Personen, die uns eingeladen haben, danken.
Auch wenn es kindisch ist, hoffe ich, dass dieser Artikel RSpec-Anfängern helfen wird. Danke, dass du bis zum Ende zugesehen hast!
[Einführung in RSpec, die verwendet werden kann, Teil 4 "Jede Browseroperation ist kostenlos! Reverse Capybara Encyclopedia"](https://qiita.com/jnchito/items/607f956263c38a5fec24 "Einführung in RSpec, die verwendet werden kann, Teil 4" Jede Browseroperation ist kostenlos ! Reverse Capybara Encyclopedia "") [HTML] Warum sollte das Attribut for zum lavel-Tag hinzugefügt werden? Gründliche Erklärung zur Verwendung!