RSpec-Tests für Anfänger, Teil 2

Der zweite Artikel dieser kurzen Serie zeigt, wie Sie verschiedene Matcher verwenden, die mit RSpec geliefert werden. Außerdem erfahren Sie, wie Sie Ihre Testsuite durch das Tagging aufteilen, wie Callbacks funktionieren und wie Sie Daten extrahieren. Wir erweitern das grundlegende Survival-Kit aus dem ersten Artikel ein wenig und zeigen Ihnen genug, um gefährlich zu sein, ohne zu viel Seil zum Aufhängen.

Themen

  • Matchers
  • Lassen
  • Themen
  • Rückrufe
  • Generatoren
  • Stichworte

Im ersten Artikel haben wir ziemlich viel Zeit darauf verwendet, das „Warum“ des Testens zu beantworten. Ich schlage vor, wir kehren direkt zum "Wie" zurück und sparen uns mehr Kontext. Wir haben diesen Teil bereits ausführlich behandelt. Mal sehen, was RSpec sonst noch zu bieten hat und das Sie als Anfänger sofort erledigen können.

Matchers

Das wird also den Kern der Dinge ansprechen. RSpec bietet Ihnen eine Menge so genannter Matcher. Dies ist Ihr Brot und Butter, wenn Sie Ihre Erwartungen schreiben. Soweit hast du gesehen .zu eq und .not_to eq. Es gibt jedoch ein viel größeres Arsenal, um Ihre Angaben zu schreiben. Sie können Tests durchführen, um Fehler, Wahrheitswerte und falsche Werte oder sogar für bestimmte Klassen anzuzeigen. Lassen Sie uns ein paar Optionen ausführen, um den Einstieg zu erleichtern:

  • .zu eq
  • .not_to eq 

Dies prüft die Äquivalenz.

Einige spez

… Es 'einige kluge Beschreibungen' erwarten (agent.enemy) .zu eq 'Ernst Stavro Blofeld' erwarten (agent.enemy) .not_to 'eq' Winnie Pooh 'enden ... 

Beachtung!

Um die Dinge kurz zu halten, habe ich zwei Erwartungsaussagen in eine gepackt es Block. Es ist jedoch empfehlenswert, nur eine Sache pro Test zu testen. Dadurch bleiben die Dinge fokussierter und Ihre Tests werden weniger spröde, wenn Sie sie ändern.

  • .wahr sein
  • .um wahr zu sein

Einige spez

… Es 'eine kluge Beschreibung' erwartet (agent.hero?). Erwarten_Urmut (feind.megalomanisch?). Wahres Ende sein… 

Der Unterschied ist das be_truthy ist wahr, wenn es nicht ist Null oder falsch. Es wird also vorübergehen, wenn das Ergebnis keine dieser beiden Arten von "wahrhaftig" ist.. .um wahr zu sein akzeptiert dagegen nur einen Wert, der ist wahr und sonst nichts.

  • .falsch sein
  • .falsch sein

Einige spez

… Es 'eine kluge Beschreibung' erwartet (agent.coward?). Erwarten, dass sie falsch ist (feind.megalomanisch?). 

Ähnlich wie in den beiden obigen Beispielen, .falsch sein erwartet entweder a falsch oder ein Null Wert und .falsch sein führt nur einen direkten Vergleich an falsch.

  • .zu sein
  • .to_not be_nil

Und last but not least testet das genau Null selbst. Ich erspare dir das Beispiel.

  • .passen()

Ich hoffe, Sie hatten bereits das Vergnügen, sich mit regulären Ausdrücken zu beschäftigen. Ist dies nicht der Fall, handelt es sich um eine Folge von Zeichen, mit der Sie ein Muster definieren können, das Sie zwischen zwei Schrägstrichen für Suchstrings setzen. Ein Regex kann sehr praktisch sein, wenn Sie nach breiteren Mustern suchen möchten, die Sie in einem solchen Ausdruck verallgemeinern könnten.

Einige spez

… Es erwartet eine 'kluge Beschreibung' (agent.number.to_i) .to (/ \ d 3 /) enden ... 

Angenommen, wir haben es mit Agenten wie James Bond, 007 zu tun, denen dreistellige Nummern zugewiesen werden. Dann könnten wir es natürlich hier so primitiv testen.

  • >
  • <
  • <=
  • > =

Vergleiche sind häufiger hilfreich als man denkt. Ich gehe davon aus, dass die unten stehenden Beispiele das umfassen werden, was Sie wissen müssen.

Einige spez

… Es 'einige kluge Beschreibungen' tun… erwarten (Agentennummer) < quartermaster.number expect(agent.number).to be > m.number erwarten (agent.kill_count). to> = 25 erwarten (quartermaster.number_of_gadgets). sein <= 5 end… 

Jetzt werden wir weniger langweilig. Sie können auch Klassen und Typen testen:

  • .in_in_instance_of
  • .ein ... zu sein
  • .ein ... sein

Einige spez

… Es 'eine kluge Beschreibung' do mission = Mission.create (Name: 'Moonraker') agent = Agent.create (Name: 'James Bond'): Mission.agents << agent expect(@mission.agents).not_to be_an_instance_of(Agent) expect(@mission.agents).to be_a(ActiveRecord::Associations::CollectionProxy) end… 

In dem Dummy-Beispiel oben sehen Sie, dass eine Liste von Agenten, die einer Mission zugeordnet sind, keine Klasse ist Agent aber von ActiveRecord :: Associations :: CollectionProxy. Was Sie von diesem nehmen sollten, ist, dass wir leicht selbst nach den Kursen testen können, während wir gleichzeitig ausdrucksstark bleiben. .ein ... zu sein und .ein ... sein ein und dasselbe tun. Sie haben beide Möglichkeiten, um die Dinge lesbar zu halten.

Das Testen auf Fehler ist in RSpec auch äußerst bequem. Wenn Sie für Rails sehr frisch sind und sich noch nicht sicher sind, welche Fehler das Framework auf Sie werfen kann, haben Sie möglicherweise nicht das Bedürfnis, diese zu verwenden - natürlich ist das absolut sinnvoll. Zu einem späteren Zeitpunkt in Ihrer Entwicklung werden Sie sie jedoch sehr praktisch finden. Sie haben vier Möglichkeiten, mit ihnen umzugehen:

  • .to_error erhöhen

Dies ist der allgemeinste Weg. Welcher Fehler auch immer auftritt, wird in Ihr Netz übertragen.

  • .to error_error (ErrorClass)

Auf diese Weise können Sie genau angeben, aus welcher Klasse der Fehler stammen soll.

  • .to raise_error (ErrorClass, "Einige Fehlermeldung")

Dies ist noch feiner, da Sie nicht nur die Klasse des Fehlers angeben, sondern auch eine bestimmte Nachricht, die mit dem Fehler ausgegeben werden sollte.

  • .to raise_error ("Einige Fehlermeldung)

Oder Sie erwähnen die Fehlermeldung selbst ohne die Fehlerklasse. Der erwartete Teil muss jedoch etwas anders geschrieben werden - wir müssen den Teil unter Text in einen Codeblock selbst einschließen:

Einige spez

… Es 'einige clevere Beschreibung' erwartet, dass agent = Agent.create (Name: 'James Bond') agent.lady_killer?. Erwartet, dass sich erhöh_error (NoMethodError) double_agent.name. Erwartet, um double_agent.name. name .to raise_error ("Fehler: Keine doppelten Agenten in der Umgebung") erwartet double_agent.name .to raise_error (NameError, "Fehler: Keine doppelten Agenten in der Umgebung") Ende… 
  • .beginnen mit
  • .end_with

Da wir uns beim Erstellen von Web-Apps häufig mit Sammlungen beschäftigen, ist es schön, ein Werkzeug zu haben, um einen Blick darauf zu werfen. Hier haben wir zwei Agenten hinzugefügt, Q und James Bond, und wollten nur wissen, wer in der Sammlung von Agenten für eine bestimmte Mission - hier Moonraker - an erster Stelle steht.

Einige Agentenspezifikationen

… Es ist eine clevere Beschreibung. Moonraker = Mission.create (Name: Moonraker). Bond = Agent.create (Name: James Bond). Q = Agent.create (Name: 'Q') moonraker.agents << bond moonraker.agents << q expect(moonraker.agents).to start_with(bond) expect(moonraker.agents).to end_with(q) end… 
  • .einschließen

Dieses ist auch hilfreich, um den Inhalt von Sammlungen zu überprüfen.

Einige Agentenspezifikationen

… Es 'einige kluge Beschreibungen' tun mission = Mission.create (Name: 'Moonraker') bond = Agent.create (Name: 'James Bond') mission.agents << bond expect(mission.agents).to include(bond) end… 
  • Vergleichselemente

Diese Vergleichselemente sind eine Funktion von RSpec, um Matcher dynamisch für Sie zu erstellen. Wenn Sie in Ihren Modellen Prädikatenmethoden verwenden (die mit einem Fragezeichen enden), weiß RSpec, dass es Matcher für Sie erstellen sollte, die Sie in Ihren Tests verwenden können. Im folgenden Beispiel möchten wir testen, ob ein Agent James Bond ist:

Agentenmodell

Klasse Agent < ActiveRecord::Base def bond? name == 'James Bond' && number == '007' && gambler == true end… end

Jetzt können wir das in unseren Spezifikationen so verwenden:

Einige Agentenspezifikationen

… Es 'einige clevere Beschreibung' do agent = Agent.create (Name: 'James Bond', Nummer: '007', Spieler: true). Erwarten Sie (agent). Be_bond endet damit 'einige clevere Beschreibung' do agent = Agent. create (name: 'James Bond') erwarten (agent) .not_ zum be_bond end ... 

RSpec erlaubt uns, den Methodennamen ohne Fragezeichen zu verwenden, um eine bessere Syntax zu bilden, nehme ich an. Cool, nicht wahr??

Lassen

Lassen und Lassen! mag auf den ersten Blick wie Variablen aussehen, aber sie sind eigentlich Hilfsmethoden. Die erste ist faul ausgewertet, was bedeutet, dass sie nur ausgeführt und ausgewertet wird, wenn eine Spezifikation sie tatsächlich verwendet, und die andere Option mit dem Knall (!) Ausgeführt wird, unabhängig davon, ob sie von einer Spezifikation verwendet wird oder nicht. Beide Versionen werden gespeichert und ihre Werte werden im selben Beispielbereich zwischengespeichert.

Einige Spec-Datei

beschreibe die Mission, '#prepare',: let do let (: mission) Mission.create (Name: 'Moonraker') let! (: bond) Agent.create (Name: 'James Bond') fügt hinzu Agenten zu einer Mission 'do mission.prepare (bond) erwarten (mission.agents)

Die böse Version, die nicht faul bewertet wird, kann zeitaufwendig und daher teuer sein, wenn sie zu Ihrem neuen Freund wird. Warum? Weil es diese Daten für jeden fraglichen Test einrichtet, egal was passiert, und letztendlich zu einem dieser bösen Dinge werden kann, die Ihre Testsuite erheblich verlangsamen.

Sie sollten diese Funktion von RSpec seit kennen Lassen ist weithin bekannt und wird verwendet. Der nächste Artikel zeigt Ihnen jedoch einige Probleme, die Sie kennen sollten. Verwenden Sie diese Hilfsmethoden mit Vorsicht oder zumindest in kleinen Dosen.

Themen

RSpec bietet Ihnen die Möglichkeit, das zu prüfende Thema sehr explizit zu deklarieren. Dafür gibt es bessere Lösungen. Wir werden im nächsten Artikel die Nachteile dieses Ansatzes besprechen, wenn ich einige Dinge aufzeigen möchte, die Sie normalerweise vermeiden möchten. Aber jetzt schauen wir uns mal was an Gegenstand kann für Sie tun:

Einige Spec-Datei

Beschreibe Agent, '#status' Betreff Agent.create (Name: 'Bond') gibt 'den Agentenstatus zurück' erwartet (Betreff.status) .not_, 'MIA' Ende

Dieser Ansatz kann einerseits dazu beitragen, die Code-Duplizierung zu reduzieren, indem ein Protagonist einmal in einem bestimmten Umfang deklariert wird, er kann jedoch auch zu einem so genannten Mystery-Gast führen. Dies bedeutet einfach, dass wir möglicherweise in einer Situation landen, in der wir Daten für eines unserer Testszenarien verwenden, aber keine Ahnung mehr haben, woher sie eigentlich kommen und woraus sie bestehen. Mehr dazu im nächsten Artikel.

Rückrufe

Falls Sie noch keine Rückrufe erhalten, lassen Sie mich kurz auf Sie eingehen. Callbacks werden zu bestimmten Zeitpunkten im Lebenszyklus von Code ausgeführt. In Bezug auf Rails würde dies bedeuten, dass Sie über Code verfügen, der ausgeführt wird, bevor Objekte erstellt, aktualisiert oder gelöscht werden. 

Im Zusammenhang mit RSpec ist dies der Lebenszyklus der durchgeführten Tests. Das bedeutet einfach, dass Sie Hooks angeben können, die vor oder nach dem Ausführen eines Tests in der Spezifikationsdatei ausgeführt werden sollen, beispielsweise - oder einfach um jeden Test herum. Es gibt noch ein paar feinere Optionen, aber ich empfehle, dass wir uns vorerst nicht in Details verlieren. Das wichtigste zuerst:

  • vor (jeweils)

Dieser Callback wird vor jedem Testbeispiel ausgeführt.

Einige Spec-Datei

Beschreibe Agent, '#favorite_gadget' mache vorher (: each) do @gagdet = Gadget.create (Name: 'Walther PPK') end es 'gibt ein Element zurück, das bevorzugte Gadget des Agenten' do agent = Agent.create (name : 'James Bond') agent.favorite_gadgets << @gadget expect(agent.favorite_gadget).to eq 'Walther PPK' end… end

Angenommen, Sie benötigen für jeden Test, den Sie in einem bestimmten Bereich ausführen, ein bestimmtes Gadget. Vor lässt Sie dies in einen Block extrahieren und bereitet diesen kleinen Ausschnitt für Sie bequem vor. Wenn Sie Daten auf diese Weise einrichten, müssen Sie natürlich Instanzvariablen verwenden, um zwischen verschiedenen Bereichen darauf zugreifen zu können.

Beachtung!

Lassen Sie sich in diesem Beispiel nicht aus Bequemlichkeit täuschen. Nur weil Sie diese Sachen machen können, heißt das nicht, dass Sie das tun sollten. Ich möchte vermeiden, in das Antipattern-Territorium zu gehen und die Hölle aus Ihnen zu verwirren, aber auf der anderen Seite möchte ich auch die Nachteile dieser einfachen Dummy-Übungen etwas erklären. 

Im obigen Beispiel wäre es viel aussagekräftiger, wenn Sie die benötigten Objekte testweise einrichten. Insbesondere bei größeren Spec-Dateien können Sie diese kleinen Verbindungen schnell aus den Augen verlieren und es für andere schwieriger machen, diese Rätsel zusammenzusetzen.

  • vor allen)

Diese Vor Block läuft nur einmal vor allen anderen Beispielen in einer Spezifikationsdatei.

Einige Spec-Datei

Beschreibe Agent, '#enemy' vor (: alle) do @main_villain = Villain.create (Name: 'Ernst Stavro Blofeld') @mission = Mission.create (Name: 'Moonraker') @ mission.villains << @main_villain end it 'returns the main enemy Bond has to face in his mission' do agent = Agent.create(name: 'James Bond') @mission.agents << agent expect(agent.enemy).to eq 'Ernst Stavro Blofeld' end… end

Wenn Sie sich an die vier Testphasen erinnern, Vor Blöcke sind manchmal hilfreich, um etwas für Sie einzurichten, das regelmäßig wiederholt werden muss - wahrscheinlich Sachen, die etwas mehr Meta in der Natur sind.

nach jedem) und Letztendlich) haben das gleiche Verhalten, werden aber einfach ausgeführt, nachdem Ihre Tests ausgeführt wurden. nach dem wird häufig zum Bereinigen Ihrer Dateien verwendet. Aber ich denke, es ist noch ein bisschen zu früh. Machen Sie es also in Erinnerung, wissen Sie, dass es für den Fall da ist, dass Sie es brauchen, und lassen Sie uns weitere grundlegende Dinge erkunden.

Alle diese Rückrufe können strategisch an Ihre Bedürfnisse angepasst werden. Platziere sie in einem beschreiben Sperren Sie den Umfang, den Sie zum Ausführen benötigen - sie müssen nicht unbedingt über Ihrer Spezifikationsdatei platziert werden. Sie können leicht in Ihre Spezifikationen eingebettet werden. 

Einige Spec-Datei

Beschreibe Agent do before (: each) do @mission = Mission.create (Name: 'Moonraker') @bond = Agent.create (Name: 'James Bond', Nummer: '007') Ende beschreibe '#enemy' vorher (: each) do @main_villain = Villain.create (Name: 'Ernst Stavro Blofeld') @ mission.villains << @main_villain end describe 'Double 0 Agent with associated mission' do it 'returns the main enemy the agent has to face in his mission' do @mission.agents << @bond expect(@bond.enemy).to eq 'Ernst Stavro Blofeld' end end describe 'Low-level agent with associated mission' do it 'returns no info about the main villain involved' do some_schmuck = Agent.create(name: 'Some schmuck', number: '1024') @mission.agents << some_schmuck expect(some_schmuck.enemy).to eq 'That's above your paygrade!' end end… end end

 Wie Sie sehen können, können Sie Callback-Blöcke in jedem Bereich nach Ihren Wünschen platzieren und so tief gehen, wie Sie es brauchen. Der Code im Callback wird im Geltungsbereich eines beliebigen Blockbausteins ausgeführt. Aber ein kleiner Tipp: Wenn Sie das Bedürfnis haben, zu viel zu schachteln und die Dinge ein bisschen unordentlich und kompliziert zu werden, überdenken Sie Ihre Vorgehensweise und überlegen Sie, wie Sie die Tests und ihre Einrichtung vereinfachen könnten. KUSS! Halten Sie es einfach dumm. Achten Sie auch darauf, wie gut sich dies liest, wenn Sie die Ausführung dieser Tests erzwingen:

Ausgabe

Fehler: 1) Agent # Feind Double 0 Agent mit zugehöriger Mission gibt den Hauptfeind zurück, dem der Agent in seiner Mission gegenüberstehen muss. Failure / Error: erwarten (@ bond.enemy) .zu EQ 'Ernst Stavro Blofeld' erwartet: "Ernst Stavro Blofeld "got:" Blofeld "2) Agent # Feind Low-Level-Agent mit zugehöriger Mission gibt keine Informationen über den Hauptschurken aus. Fehlschlag / Fehler: Erwarten Sie (some_schmuck.enemy) .to eq" Das ist über Ihrer Gehaltsstufe! " erwartet: "Das ist über Ihrem Gehaltsniveau!" bekam: "Blofeld"

Generatoren

Schauen wir uns auch kurz an, welche Generatoren von RSpec für Sie bereitgestellt werden. Sie haben schon eine gesehen, als wir verwendet haben Schienen generieren rspec: install. Dieser kleine Kerl machte die Einrichtung von RSpec für uns schnell und einfach. Was haben wir noch??

  • Rspec: Modell

Möchten Sie eine andere Dummy-Modellspezifikation haben??

Terminal

Schienen erzeugen rspec: model another_dummy_model

Ausgabe

Erstellen Sie spec / models / another_dummy_model_spec.rb

Schnell, nicht wahr? Oder eine neue Spezifikation für einen Controller-Test, zum Beispiel:

  • Rspec: Controller

Terminal

Schienen generieren rspec: controller dummy_controller

Ausgabe

spec / controller / dummy_controller_controller_spec.rb
  • rspec: anzeigen

Das gilt natürlich auch für Ansichten. Wir werden jedoch keine Ansichten dieser Art testen. Spezifikationen für Ansichten geben Ihnen den geringsten Nutzen für das Geld, und in fast jedem Szenario reicht es völlig aus, Ihre Ansichten indirekt über Funktionstests zu testen. 

Funktionstests sind keine Spezialität von RSpec und eignen sich eher für andere Artikel. Wenn Sie jedoch neugierig sind, schauen Sie sich Capybara an, ein hervorragendes Werkzeug für solche Dinge. Sie können damit ganze Abläufe testen, bei denen mehrere Teile Ihrer App zusammen getestet werden, um vollständige Funktionen zu testen und gleichzeitig die Browser-Erfahrung zu simulieren. Zum Beispiel ein Benutzer, der für mehrere Artikel in einem Einkaufswagen bezahlt.

  • rspec: helfer

Dieselbe Generatorstrategie erlaubt es uns, einen Helfer ohne viel Aufwand zu platzieren.

Terminal

Schienen generieren rspec: helper dummy_helper

Ausgabe

Erstellen Sie spec / helpers / dummy_helper_helper_spec.rb

Der Doppelgänger helper_helper Teil war kein Zufall. Wenn wir ihm einen "aussagekräftigeren" Namen geben, werden Sie sehen, dass RSpec nur anhängt _Helfer allein.

Terminal

Schienen generieren rspec: helper important_stuff

Ausgabe

Erstellen Sie spec / helpers / important_stuff_helper_spec.rb

Ein Wort über Helfer

Nein, dieses Verzeichnis ist kein Ort, an dem Sie Ihre wertvollen Hilfsmethoden sammeln können, die beim Refactoring Ihrer Tests auftauchen. Diese würden untergehen spezifikation / unterstützung, tatsächlich. Spec / Helfer ist für die Tests, die Sie für Ihre View-Helfer schreiben sollten - ein Helfer mag Datum einstellen wäre ein allgemeines Beispiel. Ja, eine vollständige Testabdeckung für Ihren Code sollte auch diese Hilfsmethoden enthalten. Nur weil sie oft klein und banal erscheinen, heißt das nicht, dass wir sie übersehen oder ihr Potenzial für Fehler ignorieren sollten, die wir fangen wollen. Je komplexer der Helfer tatsächlich ist, desto mehr sollten Sie ein schreiben helper_spec dafür!

Nur für den Fall, dass Sie sofort damit anfangen, herumzuspielen, denken Sie daran, dass Sie Ihre Hilfsmethoden auf einem ausführen müssen Helfer Objekt, wenn Sie Ihre Helfer-Tests schreiben, um zu arbeiten. Sie können also nur mit diesem Objekt belichtet werden. Etwas wie das:

Einige Helfer Spec

beschreibe '#set_date' do… helper.set_date… ende… 

Sie können dieselbe Art von Generatoren für Feature-Spezifikationen, Integrationsspezifikationen und Mailer-Spezifikationen verwenden. Dies ist für heute nicht mehr möglich, aber Sie können sie zur späteren Verwendung in den Speicher übernehmen:

  • rspec: mailer
  • Rspec: Funktion
  • rspec: integration

Ein Blick auf generierte Spezifikationen

Die Spezifikationen, die wir über den Generator oben erstellt haben, sind einsatzbereit und Sie können Ihre Tests sofort dort hinzufügen. Werfen wir doch einen kleinen Blick auf die Unterschiede zwischen den Spezifikationen:

spec / models / dummy_model_spec.rb

erfordern 'Schienen_Hilfe' RSpec.describe DummyModel, geben Sie Folgendes ein:: Modell do ausstehend "fügen Sie einige Beispiele hinzu (oder löschen) # __ FILE__" Ende

spec / controller / dummy_controller_controller_spec.rb

erfordern 'Schienen_Hilfe' RSpec.describe DummyControllerController, Typ:: Controller beendet

spec / helpers / dummy_helper_helper_spec.rb

erfordern 'schienen_helfer' RSpec.describe DummyHelperHelper, tippe:: helper do ausstehend "füge einige Beispiele hinzu (oder lösche) # __ FILE__" ende

Es braucht kein Wunderkind, um herauszufinden, dass sie alle unterschiedliche Typen haben. Diese :Art RSpec-Metadaten bieten Ihnen die Möglichkeit, Ihre Tests über Dateistrukturen hinweg zu schneiden. Sie können diese Tests auf diese Weise ein bisschen besser anvisieren. Angenommen, Sie möchten, dass eine Art Helfer zum Beispiel nur für Controller-Spezifikationen geladen wird. Ein anderes Beispiel wäre, dass Sie eine andere Verzeichnisstruktur für Spezifikationen verwenden möchten, die RSpec nicht erwartet. Wenn Sie diese Metadaten in Ihren Tests haben, können Sie die RSpec-Unterstützungsfunktionen weiterhin verwenden und die Testsuite nicht stören. Sie können also die Verzeichnisstruktur verwenden, die für Sie geeignet ist, wenn Sie dies hinzufügen :Art Metadaten.

Ihre Standard-RSpec-Tests hängen jedoch nicht von diesen Metadaten ab. Wenn Sie diese Generatoren verwenden, werden sie kostenlos hinzugefügt, aber Sie können sie auch vollständig vermeiden, wenn Sie sie nicht benötigen. 

Sie können diese Metadaten auch zum Filtern in Ihren Daten verwenden. Angenommen, Sie haben einen Vorher-Block, der beispielsweise nur für Modellspezifikationen ausgeführt werden sollte. Ordentlich! Für größere Testsuiten kann dies eines Tages sehr nützlich sein. Sie können filtern, welche fokussierte Gruppe von Tests Sie ausführen möchten, anstatt die gesamte Suite auszuführen. Dies kann eine Weile dauern. 

Ihre Optionen gehen natürlich über die drei oben genannten Tagging-Optionen hinaus. Im nächsten Abschnitt erfahren Sie mehr über das Schneiden und Würfeln Ihrer Tests.

Stichworte

Wenn Sie im Laufe der Zeit eine größere Testsuite erstellen, reicht es nicht aus, Tests in bestimmten Ordnern auszuführen, um RSpec-Tests schnell und effizient auszuführen. Sie möchten Tests ausführen, die zusammengehören, sich aber auf mehrere Verzeichnisse verteilen können. Tagging zur Rettung! Verstehen Sie mich nicht falsch, Ihre Tests ordentlich in Ihren Ordnern zu organisieren, ist auch der Schlüssel, aber das Markieren bringt dies ein wenig weiter.

Sie geben Ihren Tests einige Metadaten als Symbole wie „: wip“, „: checkout“ oder was auch immer Ihren Bedürfnissen entspricht. Wenn Sie diese fokussierten Testgruppen ausführen, geben Sie einfach an, dass RSpec diesmal die Ausführung anderer Tests ignorieren soll, indem Sie ein Flag mit dem Namen der Tags angeben.

Einige Spec-Datei

beschreiben Agent,: wip do 'ist momentan ein Durcheinander' erwarten (agent.favorite_gadgets) .to eq 'Unbekanntes' Ende

Terminal

rspec - tag wip

Ausgabe

Fehler: 1) Agent ist momentan ein Durcheinander Fehler / Fehler: erwarten (agent.favorite_gadgets) .to eq 'Unknown'… 

Sie können auch alle Arten von Tests ausführen und eine Gruppe von Gruppen ignorieren, die auf bestimmte Weise markiert sind. Sie müssen nur eine Tilde (~) vor dem Tag-Namen angeben, und RSpec ignoriert diese Tests gerne.

Terminal

rspec --tag ~ wip

Das gleichzeitige Ausführen mehrerer Tags ist kein Problem:

Terminal

rspec -tag wip -tag checkout rspec -tag ~ wip -tag checkout

Wie Sie oben sehen können, können Sie sie nach Belieben kombinieren. Die Syntax wiederholt sich nicht perfekt --Etikett ist vielleicht nicht ideal - aber hey, es ist auch kein großes Problem! Ja, all das ist ein bisschen mehr Arbeit und mentaler Aufwand, wenn Sie die Spezifikationen zusammenstellen, aber auf der anderen Seite bietet es Ihnen wirklich die mächtige Fähigkeit, Ihre Testsuite nach Bedarf aufzuteilen. Bei größeren Projekten können Sie so eine Menge Zeit sparen.

Abschließende Gedanken

Was Sie bisher gelernt haben, sollte Sie mit den absoluten Grundlagen ausstatten, um mit eigenen Tests zu spielen - ein Überlebenskit für Anfänger. Und wirklich spielen und so viel Fehler machen, wie Sie können. Nehmen Sie RSpec und die gesamte testgetriebene Sache für eine Runde und erwarten Sie nicht, sofort Qualitätstests zu schreiben. Es fehlen noch ein paar Teile, bevor Sie sich wohl fühlen und bevor Sie damit arbeiten. 

Für mich war das anfangs etwas frustrierend, weil es schwierig war, etwas zu testen, als ich es noch nicht implementiert hatte und nicht wusste, wie es sich verhalten würde. 

Tests zeigen wirklich, ob Sie ein Framework wie Rails verstehen und wissen, wie die Teile zusammenpassen. Wenn Sie Tests schreiben, müssen Sie in der Lage sein, Erwartungen hinsichtlich des Verhaltens eines Frameworks zu schreiben. 

Das ist nicht einfach, wenn Sie erst mit all dem anfangen. Der Umgang mit mehreren domänenspezifischen Sprachen - hier RSpec und Rails - zum Beispiel das Erlernen der Ruby-API kann sehr verwirrend sein. Fühlen Sie sich nicht schlecht, wenn die Lernkurve entmutigend erscheint. es wird einfacher, wenn Sie dabei bleiben. Diese Glühbirne ausschalten zu lassen, passiert nicht über Nacht, aber für mich war es die Mühe wert.