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.
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.
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.
… Es 'einige kluge Beschreibungen' erwarten (agent.enemy) .zu eq 'Ernst Stavro Blofeld' erwarten (agent.enemy) .not_to 'eq' Winnie Pooh 'enden ...
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
… 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
… 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.
… 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.
… 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
… 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:
… 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.
… 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.
… 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…
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:
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:
… 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
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.
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.
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:
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.
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.
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.
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.
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.
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:
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"
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??
Schienen erzeugen rspec: model another_dummy_model
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
Schienen generieren rspec: controller dummy_controller
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.
Schienen generieren rspec: helper dummy_helper
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.
Schienen generieren rspec: helper important_stuff
Erstellen Sie spec / helpers / important_stuff_helper_spec.rb
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:
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:
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:
erfordern 'Schienen_Hilfe' RSpec.describe DummyModel, geben Sie Folgendes ein:: Modell do ausstehend "fügen Sie einige Beispiele hinzu (oder löschen) # __ FILE__" Ende
erfordern 'Schienen_Hilfe' RSpec.describe DummyControllerController, Typ:: Controller beendet
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.
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.
beschreiben Agent,: wip do 'ist momentan ein Durcheinander' erwarten (agent.favorite_gadgets) .to eq 'Unbekanntes' Ende
rspec - tag wip
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.
rspec --tag ~ wip
Das gleichzeitige Ausführen mehrerer Tags ist kein Problem:
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.
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.