zurückgegebenes Objekt

Diese zweiteilige Miniserie wurde für Menschen geschrieben, die sich für die Arbeit mit Factory Girl interessieren und auf die Jagd gehen wollen, ohne sich die Dokumentation zu sehr anzusehen. Für Leute, die vor kurzem angefangen haben, mit Tests zu spielen, habe ich mein Bestes getan, um es für Neulinge zu halten.

Da ich zu irgendeinem Zeitpunkt in denselben Schuhen war, glaubte ich natürlich, dass es nicht viel braucht, damit sich neue Menschen beim Testen wohler fühlen. Wenn Sie sich etwas mehr Zeit nehmen, um den Kontext zu erläutern und die Sprache zu entmystifizieren, reduzieren Sie die Frustrationsraten für Anfänger.

Inhalt

  • Intro & Kontext
  • Fixtures
  • Aufbau
  • Fabriken definieren
  • Fabriken verwenden
  • Erbe
  • Mehrere Datensätze
  • Sequenzen

Intro & Kontext

Beginnen wir mit etwas Geschichte und sprechen wir über die feinen Leute von thoughtbot, die für diesen beliebten Ruby-Edelstein verantwortlich sind. Im Jahr 2007/2008 hatte Joe Ferris, CTO von thoughtbot, die Vorbereitungen getroffen und begann, seine eigene Lösung zuzubereiten. Das Durchlaufen verschiedener Dateien zum Testen einer einzelnen Methode war ein häufiger Schmerzpunkt, wenn es um Fixtures ging. Anders ausgedrückt, und alle Arten von Inflexibilitäten ignorierend, führt diese Praxis auch dazu, dass Sie Tests schreiben, die Ihnen nicht viel über ihren Kontext sagen, der gerade getestet wird.

Da er bei dieser derzeitigen Praxis nicht verkauft wurde, musste er verschiedene Lösungen für Fabriken prüfen, aber keiner von ihnen unterstützte alles, was er wollte. Also kam er zu Factory Girl, das das Testen mit Testdaten lesbarer, DRY und auch expliziter machte, indem es Ihnen den Kontext für jeden Test gab. Ein paar Jahre später übernahm Josh Clayton, Entwicklungsdirektor bei thoughtbot in Boston, die Verantwortung für das Projekt. Im Laufe der Zeit ist dieses Juwel stetig gewachsen und hat sich zu einer festen Größe in der Ruby-Community entwickelt.

Lassen Sie uns mehr über die Hauptprobleme sprechen, die Factory Girl löst. Wenn Sie Ihre Testsuite erstellen, handelt es sich um eine Vielzahl zugehöriger Datensätze und um Informationen, die sich häufig ändern. Sie möchten Datensätze für Ihre Integrationstests erstellen können, die nicht spröde, einfach zu verwalten und explizit sind. Ihre Datenfabriken sollten dynamisch sein und auf andere Fabriken verweisen können - etwas, das zum Teil jenseits von YAML-Geräten aus alten Zeiten liegt.

Ein weiterer Komfort, den Sie haben möchten, ist die Möglichkeit, Attribute für Objekte im laufenden Betrieb zu überschreiben. Factory Girl ermöglicht es Ihnen, all dies mühelos zu erledigen - angesichts der Tatsache, dass es in Ruby geschrieben ist und hinter den Kulissen eine Menge Metaprogramm-Hexerei abläuft - und Sie erhalten eine großartige domänenspezifische Sprache, die für die Augen angenehm ist auch.

Der Aufbau Ihrer Fixture-Daten mit diesem Edelstein kann als einfach, effektiv und insgesamt als bequemer bezeichnet werden, als mit Fixtures herumzuspielen. Auf diese Weise können Sie mehr mit Konzepten umgehen als mit den eigentlichen Spalten in der Datenbank. Aber genug von dem Gespräch, lasst uns unsere Hände ein bisschen schmutzig machen.

Fixtures?

Leute, die bereits Erfahrung mit dem Testen von Anwendungen haben und sich nicht mit dem Konzept der Geräte vertraut machen müssen, können sich gerne direkt zum nächsten Abschnitt begeben. Dies ist für Neulinge, die nur ein Update zum Testen von Daten benötigen.

Fixtures sind Beispieldaten - das war es wirklich! Für einen guten Teil Ihrer Testsuite möchten Sie Ihre Testdatenbank mit Daten füllen, die auf Ihre spezifischen Testfälle zugeschnitten sind. Eine ganze Weile verwendeten viele Entwickler YAML für diese Daten, was sie datenbankunabhängig machte. Im Nachhinein war es vielleicht das Beste, auf diese Weise unabhängig zu sein. Es war mehr oder weniger eine Datei pro Modell. Das allein könnte Ihnen eine Vorstellung von allen Arten von Kopfschmerzen geben, über die sich die Leute beschwerten. Komplexität ist ein schnell wachsender Gegner, für den YAML kaum geeignet ist, effektiv zu bestehen. Unten sehen Sie was so ein .yml Datei mit Testdaten sieht aus wie.

YAML-Datei: secret_service.yml

"plain Quartermaster: name: Q favorite_gadget: Besenfunkfähigkeiten: Gizmos erfinden und Hacking

00 Agent: Name: James Bond favorite_gadget: U-Boot-Lotus-Esprit-Fähigkeiten: Bond Girls töten und verdeckte Infiltration "

Es sieht aus wie ein Hash, oder? Es ist eine durch Doppelpunkte getrennte Liste von Schlüssel / Wert-Paaren, die durch ein Leerzeichen getrennt sind. Sie können auf andere Knoten innerhalb eines anderen verweisen, wenn Sie Verknüpfungen aus Ihren Modellen simulieren möchten. Aber ich denke, es ist fair zu sagen, dass hier die Musik aufhört und viele sagen, dass ihr Schmerz beginnt. Für Datensätze, die etwas komplizierter sind, sind YAML-Fixtures schwierig zu warten und nur schwer zu ändern, ohne dass andere Tests davon betroffen sind. Natürlich können Sie sie zum Laufen bringen - schließlich haben die Entwickler sie in der Vergangenheit häufig verwendet -, aber viele waren sich einig, dass der Preis für das Verwalten von Spielgeräten etwas zu hoch war.

Um zu vermeiden, dass Ihre Testdaten bei den unvermeidlichen Änderungen beschädigt werden, haben die Entwickler gerne neuere Strategien gewählt, die mehr Flexibilität und dynamisches Verhalten bieten. Hier kam Factory Girl ins Spiel und ließ die YAML-Tage hinter sich. Ein weiteres Problem ist die starke Abhängigkeit zwischen Test und Test .yml Fixture-Datei. Rätselgäste sind auch bei solchen Anordnungen ein großer Schmerz. Factory Girl lässt Sie dies vermeiden, indem Sie für die Tests inline relevante Objekte erstellen.

Sicher, YAML-Spiele sind schnell, und ich habe gehört, dass Leute argumentieren, dass eine langsame Testsuite mit Factory-Girl-Daten dazu geführt hat, dass sie in das YAML-Land zurückkehren. Wenn Sie Factory Girl so oft verwenden, dass es Ihre Tests wirklich verlangsamt, könnten Sie die Fabriken unnötig überfordern und Strategien ignorieren, die die Datenbank nicht treffen. Sie werden sehen, was ich meine, wenn wir zu den relevanten Abschnitten gelangen. Verwenden Sie natürlich alles, was Sie brauchen, aber seien Sie gewarnt, wenn Sie von YAML verbrannt werden.

Ich denke, es wäre fair, hinzuzufügen, dass YAML-Scheinwerfer in den frühen Tagen von Rails und Ruby TDD der De-facto-Standard für das Einrichten von Testdaten in Ihrer Anwendung waren. Sie spielten eine wichtige Rolle und trugen dazu bei, die Branche voranzubringen. Heutzutage haben sie jedoch einen ziemlich schlechten Ruf. Die Zeiten ändern sich, also gehen wir weiter zu den Fabriken, die Fixtures ersetzen sollen.

Aufbau

Ich gehe davon aus, dass Sie bereits Ruby und RSpec zum Testen auf Ihrem System installiert haben. Wenn nicht, kommen Sie nach Rücksprache mit Google wieder und Sie sollten sich gut fühlen. Es ist ziemlich einfach, würde ich sagen. Sie können den gem manuell in Ihrem Terminal installieren Schale:

bash gem install factory_girl

oder füge es zu deinem hinzu Gemfile:

Rubinstein "factory_girl", "~> 4.0" und Renn Bundle installieren.

Jetzt musst du nur noch benötigen Factory Girl um Ihr Setup abzuschließen. Hier verwende ich RSpec, füge also oben folgendes ein /spec/spec_helper.rb:

Rubin erfordert 'factory_girl'

Ruby on Rails

Sie sind selbstverständlich abgesichert, wenn Sie Factory Girl with Rails verwenden möchten. Das factory_girl_rails gem bietet eine praktische Rails-Integration für factory_girl.

Schale:

bash gem install factory_girl_rails

Gemfile:

Rubinstein "factory_girl_rails", "~> 4.0"

und benötigen es natürlich in spec / spec_helper.rb:

Rubin erfordert 'factory_girl_rails'

Bequemes Syntax-Setup

Wenn Sie lieber etwas schreiben möchten (natürlich)

Rubin:

ruby create (: user)

anstatt

ruby FactoryGirl.create (: user)

Jedes Mal, wenn Sie eine Ihrer Fabriken verwenden, müssen Sie nur die FactoryGirl :: Syntax :: Methoden Modul in Ihrer Testkonfigurationsdatei. Wenn Sie diesen Schritt vergessen, müssen Sie alle Factory Girl-Methoden mit demselben ausführlichen Vorwort vorbereiten. Dies funktioniert mit jeder Ruby-App, natürlich nicht nur mit Rails.

Für RSpec finden Sie die spec / spec_helper.rb Datei und fügen Sie hinzu:

"Rubin erfordert 'factory_girl_rails'

RSpec.config do | config | config.include FactoryGirl :: Syntax :: Methods end "

Beachtung!

Passen Sie für die Neulinge unter Ihnen auf, dass die RSpec.configure Block wird bereits unter einigen Kommentaren begraben. Sie können dasselbe Setup auch in einer separaten Datei Ihrer eigenen Art vornehmen spec / support / factory_girl.rb. In diesem Fall müssen Sie natürlich den gesamten Konfigurationsblock selbst hinzufügen.

Die gleiche Konfiguration funktioniert, wenn Sie andere Bibliotheken zum Testen verwenden:

  • Test :: Einheit
  • Gurke
  • Spinat
  • MiniTest
  • MiniTest :: Spec
  • Minitest-Schienen

Sie können Ihre Konfiguration noch schicker gestalten, indem Sie hineinwerfen DatabaseCleaner, Zum Beispiel, aber die Dokumentation impliziert, dass dieses Setup ausreicht, um loszulegen, also gehe ich von hier aus weiter.

Fabriken definieren

Sie können Ihre Fabriken überall definieren, sie werden jedoch automatisch geladen, wenn sie an den folgenden Stellen platziert werden:

RSpec:

bash spec / factories.rb spec / factories / *. rb

Test :: Einheit:

bash test / factories.rb test / factories / *. rb

Wie Sie sehen, haben Sie die Möglichkeit, sie in separate Dateien aufzuteilen, die sich an die Logik halten, oder Ihre Fabriken zu einer großen zusammenzufassen factories.rb Datei. Die Komplexität Ihres Projekts ist die beste Richtlinie, wenn Sie Fabriken logisch in ihre eigenen separaten Dateien aufteilen.

Nackte Knochenfabriken

Factory Girl bietet eine gut entwickelte Ruby-DSL-Syntax für die Definition von Fabriken wie Nutzer, Post oder irgendein anderes Objekt - nicht nur Aktiver Rekord Objekte. "Plain" Ruby-Klassen sind vollkommen in Ordnung. Sie beginnen mit dem Definieren eines Definitionsblocks in Ihrem factories.rb Datei.

Rubin:

"ruby FactoryGirl.define tun

Ende"

In diesem Block sind alle Fabriken definiert. Fabriken brauchen nur eine :Symbol Name und eine Reihe von Attributen, um loszulegen. Dieser Name muss der sein snake_cased Version des Modells, das Sie wie SecretServiceAgent im folgenden Beispiel emulieren möchten. Die Fabrik unten heißt secret_service_agent und hat Attribute aufgerufen Name, favorite_gadget und Kompetenzen.

Rubin:

"ruby FactoryGirl.define tun

factory: secret_service_agent do "Q" favorite_gadget "U-Boot-Lotus-Esprit-Fähigkeiten" Ende der Entwicklung von Gizmos und Hacking

Ende"

Beachtung!

Wenn Sie eine Sache aus diesem Artikel herausnehmen, sollte dies Folgendes sein: Definieren Sie nur die Bare-Bones-Factory, die möglich ist, um beispielsweise im Sinne von Active Record-Validierungen standardmäßig gültig zu sein.

Wenn Factory Girl anruft sparen! In bestimmten Fällen werden Ihre Validierungen ausgeübt. Wenn einer von ihnen versagt, ActiveRecord :: RecordInvalid wird angehoben Wenn Sie nur das Nötigste definieren, erhalten Sie mehr Flexibilität, wenn sich Ihre Daten ändern, und verringern die Wahrscheinlichkeit, dass Sie Tests und Duplikate brechen, da die Kopplung an den Kern reduziert wird. Seien Sie nicht faul, wenn Sie Ihre Fabriken zusammenstellen - es wird sich bezahlt machen!

Wenn Sie der Meinung sind, dass dies schwierig zu handhaben ist, werden Sie höchstwahrscheinlich froh sein, dass es praktische Lösungen gibt, um Objekte und ihre Attribute voneinander zu trennen. Erbe und Züge wird zu großartigen Verbündeten, da sie nützliche Strategien sind, um Ihre nackten Knochenfabriken zu ergänzen und gleichzeitig trocken zu halten. Erfahren Sie unten mehr über Vererbung, und mein zweiter Artikel wird sich ziemlich auf Traits konzentrieren.

Fabriken verwenden

Wenn Sie die aufgenommen haben FactoryGirl :: Syntax :: Methoden Im Konfigurationsschritt können Sie die Abkürzungssyntax verwenden, um Factories in Ihren Tests zu erstellen. Sie haben vier Möglichkeiten, die die Leute anrufen Strategien aufbauen:

erstellen

ruby create (: some_object) # FactoryGirl.create (: some_object)

Dieser gibt eine Instanz der Klasse zurück, die die Factory emuliert. Es wird empfohlen zu verwenden erstellen nur dann, wenn Sie wirklich auf die Datenbank zugreifen müssen. Diese Strategie verlangsamt Ihre Testsuite, wenn sie nicht unnötig verwendet wird. Verwenden Sie es, wenn Sie Ihre Validierungen ausführen möchten, da es ausgeführt wird sparen! im Hintergrund. Ich denke, diese Option ist am besten geeignet, wenn Sie Integrationstests durchführen, in die Sie eine Datenbank für Ihre Testszenarien einbeziehen möchten.

bauen

ruby build (: some_object) # FactoryGirl.build (: some_object)

Es instanziiert und weist Attribute zu, es wird jedoch eine Instanz zurückgegeben, die nicht in der Datenbank gespeichert wird-bauen hält das Objekt nur im Speicher. Wenn Sie prüfen möchten, ob ein Objekt bestimmte Attribute aufweist, erledigt dies die Aufgabe, da Sie für diese Art von Daten keinen Datenbankzugriff benötigen. Hinter den Kulissen nutzt es nicht sparen!, was bedeutet, dass Ihre Validierungen nicht ausgeführt werden.

Kopf hoch!

Wenn Sie Assoziationen dazu verwenden, stoßen Sie möglicherweise auf ein kleines Problem. Es gibt eine kleine Ausnahme, wenn Sie das Objekt nicht über speichern bauen-es baut das Objekt aber es schafft die Assoziationen, die ich im Abschnitt über Factory Girl-Assoziationen behandeln werde. Es gibt eine Lösung für den Fall, dass Sie nicht danach gesucht haben.

build_stubbed

ruby build_stubbed (: some_object) # FactoryGirl.build_stubbed (: some_object)

Diese Option wurde zur Beschleunigung Ihrer Tests und für Testfälle erstellt, bei denen kein Code in die Datenbank aufgenommen werden muss. Es instanziiert und ordnet Attribute als zu bauen tut, aber es lässt Objekte nur so aussehen, als wären sie persistent. Das zurückgegebene Objekt verfügt über alle definierten Attribute Ihrer Fabrik, die mit einem Fake versehen wurden Ich würde und Null Zeitstempel. Ihre Assoziationen sind so gut wie anders bauen Verbände, die verwenden erstellen auf zugehörige Objekte. Da es sich bei dieser Strategie um Stubs handelt und keine Abhängigkeit von der Datenbank besteht, sind diese Tests so schnell wie sie kommen.

attributes_for

Diese Methode gibt nur einen Hashwert der in der jeweiligen Factory definierten Attribute zurück - natürlich ohne Zuordnungen, Zeitstempel und ID. Dies ist praktisch, wenn Sie eine Instanz eines Objekts erstellen möchten, ohne manuell mit Attribut-Hashes herumzuspielen. Ich habe gesehen, dass es meistens in Controller-Spezifikationen ähnlich der folgenden verwendet wird:

Rubin:

"Ruby" leitet zu einem Ort um "postet: create, spy: attributes_for (: spy)

Erwarten (Antwort) .umleiten_zu (einige_Ort) ende "

Objektvergleich

Um diesen Abschnitt zu schließen, möchte ich Ihnen ein einfaches Beispiel geben, um die verschiedenen Objekte zu sehen, die von diesen vier Erstellungsstrategien zurückgegeben werden. Im Folgenden können Sie die vier verschiedenen Objekte vergleichen, die Sie erhalten attributes_for, erstellen, bauen und build_stubbed:

"ruby FactoryGirl.define tun

factory: spy do "Marty McSpy" favorite_gadget "Hoverboard" -Fähigkeiten "Infiltration und Spionage" enden

Ende"

"ruby attributes_for (: spy)

zurückgegebenes Objekt

"

"Ruby erstellen (: Spion)

zurückgegebenes Objekt

"

"Ruby Build (: Spion)

zurückgegebenes Objekt

"

"ruby build_stubbed (: spy)

zurückgegebenes Objekt

"

Ich hoffe, es war hilfreich, wenn Sie immer noch einige Verwirrung darüber hatten, wie sie funktionieren und wann sie welche Option verwenden.

Erbe

Du wirst diesen lieben! Mit Vererbung können Sie Fabriken nur mit den erforderlichen Attributen definieren, die jede Klasse zum Erstellen benötigt. Diese übergeordnete Fabrik kann so viele „Kindfabriken“ erzeugen, wie Sie es für alle Arten von Testszenarien mit unterschiedlichen Datensätzen benötigen. Es ist sehr wichtig, die Testdaten trocken zu halten, und die Vererbung macht es Ihnen viel einfacher.

Angenommen, Sie möchten einige Kernattribute in einer Fabrik definieren, und innerhalb derselben Fabrik gibt es unterschiedliche Fabriken für dieselbe Fabrik Klasse mit verschiedenen Attributen. Im folgenden Beispiel können Sie sehen, wie Sie das Wiederholen von Attributen vermeiden können, indem Sie Ihre Fabriken einfach verschachteln. Lassen Sie uns ein emulieren Spion Klasse, die sich an drei verschiedene Testszenarien anpassen muss.

factories.rb

"ruby FactoryGirl.define tun

Fabrik: Spion nenn 'Marty McSpy' licence_to_kill falsche Fähigkeiten 'Spionage und Intelligenz'

Fabrik: Quartiermeister nenne 'Q' Skills 'Ending Factory: Gizmos erfinden und Hacken': Bond Name: 'James Bond' licence_to_kill true end end 

Ende"

some_spec.rb

"ruby bond = create (: bond) quartermaster = create (: quartermaster)

quartermaster.name # => 'Q' quartermaster.skills # => 'Gizmos erfinden und hacken' quartermaster.licence_to_kill # => false

bond.name # => 'James Bond' bond.skills # => 'Spionage und Intelligenz' bond.licence_to_kill # => true "

Wie Sie sehen können, die :Bindung und :Quartiermeister Fabriken erben Attribute von ihren übergeordneten Elementen :Spion. Gleichzeitig können Sie Attribute einfach nach Bedarf überschreiben und über ihre Fabriknamen sehr ausdrucksstark sein. Stellen Sie sich alle gespeicherten Codezeilen vor, da Sie nicht dieselbe Grundeinstellung wiederholen müssen, wenn Sie verschiedene Zustände oder verwandte Objekte testen möchten. Allein dieses Feature ist es wert, Factory Girl zu verwenden, und es ist schwierig, zu YAML-Geräten zurückzukehren.

Wenn Sie das Verschachteln von Fabrikdefinitionen vermeiden möchten, können Sie die Factorys auch explizit mit ihren übergeordneten Elementen verknüpfen, indem Sie ein Elternteil Hash:

factories.rb

"Rubinfabrik: Spion nennen" Marty McSpy "licence_to_kill falsche Fähigkeiten" Spionage und Intelligenz "Ende

factory: bond, parent:: spy do 'James Bond' licence_to_kill wahres Ende "

Es ist die gleiche Funktionalität und fast wie DRY.

Mehrere Datensätze

Hier ist eine kleine, aber dennoch willkommene Ergänzung zu Factory Girl, die den Umgang mit Listen einfach macht.

  • build_list
  • Erstelle Liste

Hin und wieder, in Situationen, in denen Sie mehrere Instanzen einer Fabrik ohne viel Fuzz haben möchten, sind diese von Nutzen. Beide Methoden geben ein Array mit der Anzahl der angegebenen Factory-Elemente zurück. Ziemlich ordentlich richtig?

Rubin:

"ruby spy_clones = create_list (: spy, 3)

fake_spies = build_list (: spy, 3)

spy_clones # => [#, #, #]

fake_spies # => [#, #, #] "

Es gibt subtile Unterschiede zwischen den beiden Optionen, aber ich bin sicher, dass Sie sie jetzt verstanden haben. Ich sollte auch erwähnen, dass Sie beide Methoden mit einem Hash von Attributen versehen können, wenn Sie Factory-Attribute aus irgendeinem Grund im laufenden Betrieb überschreiben möchten. Wenn Sie viele Testdaten mit Überschreibungen erstellen, wird das Überschreiben etwas von Ihrer Testgeschwindigkeit abnehmen. Wenn Sie eine separate Factory mit diesen Attributen haben, ist es wahrscheinlich eine bessere Option, Listen zu erstellen.

"ruby smug_spies = create_list (: Spion, 3, Fähigkeiten: 'Smug Witze')

double_agents = build_list (: Spion, 3, Name: 'Vesper Lynd', Fähigkeiten: 'Verführung und Buchhaltung')

smug_spies # => [#, #, #]

double_agents # => [#, #, #] "

Sie benötigen häufig ein Paar Objekte. Factory Girl bietet Ihnen zwei weitere Optionen:

  • build_pair
  • create_pair

Es ist dieselbe Idee wie oben, aber das zurückgegebene Array enthält jeweils nur zwei Datensätze.

"ruby create_pair (: spy) # => [#, #]

build_pair (: spy) # => [#, #] "

Sequenzen

Wenn Sie dachten, dass das Benennen von Spionen weniger statisch sein könnte, haben Sie absolut Recht. In diesem letzten Abschnitt werden sequenzielle eindeutige Werte als Testdaten für Ihre Werksattribute erstellt.

Wann kann das nützlich sein? Was ist mit eindeutigen E-Mail-Adressen zum Beispiel zum Testen der Authentifizierung oder eindeutigen Benutzernamen? Hier leuchten Sequenzen. Schauen wir uns einige Möglichkeiten an, die Sie nutzen können Sequenz:

"Globale" Sequenz

"ruby FactoryGirl.define tun

Reihenfolge: spy_email do | n | Ende von „00#[email protected]

Fabrik: Spion Name 'Marty McSpy' E-Mail '[email protected]' Fertigkeiten 'Spionage und Infiltration' license_to_kill false

factory: elite_spy Name 'Edward Donne' license_to_kill True End End 

Ende

top_spy = create (: elite_spy) top_spy.email = generate (: spy_email)

top_spy.email # => "[email protected]" ""

Da diese Sequenz für alle Ihre Fabriken „global“ definiert ist (sie gehört nicht zu einer bestimmten Fabrik), können Sie diesen Sequenzgenerator für alle Ihre Fabriken verwenden, wo immer Sie eine benötigen : spy_email. Alles was Sie brauchen ist generieren und den Namen Ihrer Sequenz.

Attribute

Als kleine Variante, die sehr praktisch ist, werde ich Ihnen zeigen, wie Sie Sequenzen direkt als Attribute Ihren Fabriken zuordnen können. Verwenden Sie die gleiche Bedingung wie oben, wobei Ihre Sequenz "global" definiert ist. Im Falle einer Werksdefinition können Sie die generieren Methodenaufruf und Factory Girl weist den aus der Sequenz zurückgegebenen Wert direkt dem Attribut desselben Namens zu. Ordentlich!

"ruby FactoryGirl.define tun

Reihenfolge: E-Mail do | n | Ende von „00#[email protected]

factory: secret_service_agent Name 'Edwad Donne' E-Mail-Kenntnisse 'Spionage und Infiltration' license_to_kill true end

Ende"

Faule Attribute

Sie können auch eine Sequenz auf faule Attribute. Ich werde dieses Thema in meinem zweiten Artikel behandeln, aber der Vollständigkeit halber wollte ich es auch hier erwähnen. Falls Sie einen eindeutigen Wert benötigen, der zum Zeitpunkt der Erstellung der Instanz zugewiesen wurde, wird sie aufgerufen faul denn dieses Attribut wartet mit der Wertzuweisung, bis Objekt-Instanziierungssequenzen nur einen Block benötigen, um ebenfalls zu funktionieren.

"Rubin

FactoryGirl.define tun

Reihenfolge: Mission_Abteilung do | Nummer | "Mission # number am # DateTime.now.to_formatted_s (: short)" enden

factory: spy do 'Marty McSpy', Bereitstellung erzeugen (: mission_deployment) Ende

Ende

some_spy = create (: spy) some_spy.deployment # => "Mission # 1 um 19 Okt 21:13" "

Der Block für das Factory-Attribut wird ausgewertet, wenn das Objekt instanziiert wird. In unserem Fall erhalten Sie eine Zeichenfolge, die sich aus einer eindeutigen Missionsnummer und einer neuen zusammensetzt Terminzeit Objekt als Werte für jeden :Spion das wird eingesetzt.

Inline-Sequenz

Diese Option ist am besten geeignet, wenn eine Sequenz eindeutiger Werte nur für ein Attribut für eine einzelne Fabrik benötigt wird. Es würde keinen Sinn machen, es außerhalb dieser Fabrik zu definieren, und möglicherweise müssen Sie es anderswo suchen, wenn Sie es optimieren müssen. Im folgenden Beispiel möchten wir eindeutige IDs für jedes Spionauto generieren.

"ruby FactoryGirl.define tun

factory: aston_martin do Sequenz (: Fahrzeug_ID_Nummer) | n | "A_M _ # n" Ende

Ende

spycar_01 = create (: aston_martin) spycar_01.vehicle_id_number # => "A_M_1"

spycar_02 = create (: aston_martin) spycar_02.vehicle_id_number # => "A_M_2" "

Nun, vielleicht sollten wir das zur Verfügung stellen vehicle_id_number einen anderen Startwert als angeben 1? Nehmen wir an, wir wollen ein paar Prototypen berücksichtigen, bevor das Auto zur Serienreife kam. Sie können ein zweites Argument als Startwert für Ihre Sequenz angeben. Lass uns mit gehen 9 diesmal.

"ruby FactoryGirl.define tun

factory: aston_martin do Sequenz (: Fahrzeug-ID-Nr., 9) | n | "A_M _ # n" Ende

Ende

spycar_01 = create (: aston_martin) spycar_01.vehicle_id_number # => "A_M_9"

spycar_02 = create (: aston_martin) spycar_02.vehicle_id_number # => "A_M_10"

"

Schlussgedanken

Wie Sie bereits gesehen haben, bietet Factory Girl ein ausbalanciertes Ruby DSL, das für Ihre Testdaten Objekte anstelle von Datenbankdatensätzen erstellt. Es hilft, Ihre Tests fokussiert, trocken und lesbar zu halten, wenn Sie mit Dummy-Daten arbeiten. Das ist eine ziemlich solide Leistung in meinem Buch.

Denken Sie daran, dass die Definitionen der nackten Knochenfabrik den Schlüssel für Ihre zukünftige Vernunft bilden. Je mehr Werksdaten Sie in Ihrem globalen Testbereich ablegen, desto wahrscheinlicher wird es zu Wartungsproblemen kommen.

Für Ihre Gerätetests ist Factory Girl unnötig und verlangsamt nur Ihre Testsuite. Josh Clayton wäre der erste, der das bezeugt und empfiehlt, Factory Girl möglichst selektiv und so wenig wie möglich einzusetzen.