Was ist der Unterschied zwischen RSpec ' s Thema und lassen? Wann sollte Sie verwendet werden oder nicht?
http://betterspecs.org/#subject hat einige Informationen über subject
und let
. Ich bin jedoch immer noch unklar, auf den Unterschied zwischen Ihnen. Außerdem, SO post Was ist das argument gegen die Verwendung vor lassen und das Thema in der RSpec-tests? sagte, ist es besser, nicht zu verwenden, entweder subject
oder let
. Wo soll ich hin? Ich bin so verwirrt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zusammenfassung: RSpec Thema ist eine spezielle variable, die sich auf das Objekt getestet wird. Erwartungen kann es sich implizit unterstützt, die die one-line-Beispiele. Es ist dem Leser klar, in einigen idiomatischen Fällen, aber ist sonst schwer zu verstehen und sollte vermieden werden. RSpec ist
let
Variablen sind nur faul instanziiert (memoized) Variablen. Sie sind nicht so schwer zu Folgen, da das Thema, aber es kann noch immer führen zu Wirren tests so verwendet werden, sollten mit Diskretion.Das Thema
, Wie es funktioniert
Ist das Subjekt-Objekt getestet. RSpec ist eine explizite Vorstellung von dem Thema. Es kann oder kann nicht definiert werden. Wenn es ist, RSpec, können rufen Sie die Methoden auf, ohne darauf zu verweisen ausdrücklich.
Standardmäßig, wenn das erste argument zu einem äußersten Beispiel Gruppe (
describe
odercontext
block) ist eine Klasse, RSpec erstellt eine Instanz der Klasse und weist auf das Thema. Zum Beispiel, die folgenden Pässe:Können Sie definieren, das Thema selbst mit
subject
:Können Sie geben dem Thema einen Namen, wenn Sie es definieren:
Selbst wenn Sie nennen Sie das Thema, können Sie immer noch finden es anonym:
Können Sie definieren, mehr als ein Thema benannt. Die zuletzt definierte benannte Thema ist die anonyme
subject
.Aber das Thema ist definiert,
Ist es instanziiert träge. Das heißt, die implizite Instanziierung der beschriebenen Klasse oder mit der Ausführung der block übergeben
subject
nicht der Fall, bissubject
oder der benannte Gegenstand ist, gemäß einem Beispiel. Wenn Sie möchten, dass Ihre explizite Thema instanziiert werden eifrig (vor ein Beispiel in seine Gruppe läuft), sagensubject!
stattsubject
.Erwartungen gesetzt werden können, auf die es implizit (ohne schreiben
subject
oder den Namen einer benannten Thema):Dem Thema existiert, um zu unterstützen, diese one-line-syntax.
, Wenn es zu benutzen
Einer impliziten
subject
(abgeleitet aus dem Beispiel-Gruppe) ist schwer zu verstehen, weilis_expected
ohne expliziten Empfänger) oder explizit (wiesubject
), der Leser erhält keine Informationen über die Rolle oder die Art des Objekts, auf dem die Erwartung genannt wird.it
im normalen Beispiel-syntax), so ist die einzige information, die die Leser über den Zweck des Beispiels ist die Erwartung selbst.Daher es ist nur hilfreich, um ein implizites Thema ist, wenn der Kontext wahrscheinlich zu gut verstanden werden, indem alle Leser und es gibt wirklich keine Notwendigkeit für ein Beispiel Beschreibung. Der kanonische Fall ist die Prüfung ActiveRecord Validierungen mit shoulda Matcher:
Eine explizite anonyme
subject
(definiert mitsubject
ohne Namen) ist ein wenig besser, weil der Leser sehen kann, wie es ist instanziert, aberBenannte Thema bietet eine aufschlussreichere name, aber der einzige Grund für die Verwendung einer benannten Thema, anstatt ein
let
variable ist, wenn Sie möchten, verwenden Sie das anonyme Thema für einige Zeit, und wir haben nur erklärt, warum der anonyme Thema ist schwer zu verstehen.So, legitimen Nutzungen der eine explizite anonyme
subject
oder eine benannte Thema sind sehr selten.let
Variablen, Wie Sie funktionieren
let
Variablen sind genau wie die benannten Fächer bis auf zwei Unterschiede:let
/let!
stattsubject
/subject!
subject
oder erlauben, den Erwartungen gerecht zu werden rief es implizit.Wann Sie zu verwenden
Es ist völlig legitim, zu verwenden
let
zu reduzieren, Doppelarbeit zu Beispielen. Allerdings tun Sie dies nur, wenn es nicht Opfer test Klarheit. Die sicherste Zeit, umlet
ist, wenn dielet
variable hat den Zweck ganz klar aus seinem Namen (so dass der Leser nicht finden, die definition, die viele Zeilen entfernt, zu verstehen, jedes Beispiel) und es ist verwendet in der gleichen Weise in jedem Beispiel. Wenn entweder von diesen Dingen ist nicht wahr, betrachten Sie definieren das Objekt in einem normalen alten lokalen Variablen oder den Aufruf einer factory-Methode direkt in der Beispiel.let!
ist riskant, weil es ist nicht faul. Wenn jemand fügt ein Beispiel an, das Beispiel Gruppe, die enthält dielet!
, aber das Beispiel muss nicht dielet!
variable,let!
variable und Frage mich, ob und wie es wirkt sich auf das Beispiellet!
variablleSo verwenden
let!
, wenn überhaupt, nur in kleinen, einfachen Beispiel Gruppen, in denen es weniger wahrscheinlich ist, dass zukünftige Beispiel Autoren in diese Falle tappen.Die single-Erwartung-pro-Beispiel Fetisch
Es ist eine Allgemeine überbeanspruchung der Subjekte oder
let
Variablen, die den Wert der Diskussion getrennt. Einige Leute mögen, Sie zu benutzen wie diese:(Dies ist ein einfaches Beispiel einer Methode, die eine Zahl zurückgibt, für was brauchen wir zwei Erwartungen, aber dieser Stil kann viele weitere Beispiele/Erwartungen, wenn die Methode gibt ein komplizierter Wert, muss vielen Erwartungen und/oder hat viele Nebenwirkungen, die brauchen alle Erwartungen.)
Menschen tun dies, weil Sie gehört haben, dass man nur eine Erwartung pro Beispiel (gemischt mit der gültigen Regel, dass man nur testen Sie eine Methode aufrufen pro Beispiel) oder weil Sie in der Liebe mit RSpec trickiness. Tun Sie es nicht, ob eine anonyme oder eine benannte Person oder einer
let
variable! Dieser Stil hat mehrere Probleme:Stattdessen schreiben Sie ein einziges Beispiel:
:aggregate_failures
- tag in eine Zeile wieit "marks a task complete", :aggregate_failures do
(entnommen aus dem Buch " Rails 5 Test Rezepte)expect(result).to be_between(0, 9)
.expect(result.to_s).to match(/^[0-9]$/)
- ich weiß, es ist hässlich, aber es wirklich zu testen, was Sie sagen, oder vielleicht, verwenden Siebetween
+is_a? Integer
, aber hier sind Sie testen zu geben. Und nurlet
.. es sollte nicht sein Objekt der Sorge, und es ist tatsächlich besser sein könnte, neu zu bewerten-Werte zwischen den Beispielen. Ansonsten +1 für den postlet!
- und nicht, um zu überzeugen meine Teamkollegen auf meine eigenen. Ich werde senden Sie diese Antwort mehr.Subject
undlet
sind nur Werkzeuge, um Ihnen zu helfen aufzuräumen und zu beschleunigen Ihre tests. Die Menschen in der rspec Gemeinschaft tun, verwenden Sie so ich würde nicht kümmern, ob es ok ist, Sie zu benutzen oder nicht. Sie können verwendet werden, ebenso aber dienen Sie leicht unterschiedliche ZweckeSubject
ermöglicht die Deklaration einer Testperson, und dann die Wiederverwendung es für eine beliebige Anzahl der folgenden Testfälle danach. Dies reduziert den code Wiederholung (Trocknung bis Ihr code)Let
ist eine alternative zubefore: each
Blöcke, die eine Zuordnung von Testdaten zur Instanz-Variablen.Let
gibt Ihnen ein paar Vorteile. Zunächst speichert er den Wert ohne Zuweisung an eine Instanzvariable. Zweitens, es ist träge ausgewertet, was bedeutet, dass es nicht ausgewertet, bis eine Spezifikation fordert. Solet
hilft, Sie beschleunigen Ihre tests. Ich denke auch, dasslet
ist einfacher zu Lesensubject
ist, was ist unter test, in der Regel eine Instanz oder eine Klasse.let
ist für die Zuweisung der Variablen in den tests, die bewertet werden faul vs. Verwendung von Instanz-Variablen. Es gibt einige schöne Beispiele in diesem thread.https://github.com/reachlocal/rspec-style-guide/issues/6