Andersdenkende Stimme hier: nach 5 Jahren rspec mag ich nicht let
sehr viel.
1. Faule Auswertung macht den Testaufbau oft unübersichtlich
Es wird schwierig, über das Setup nachzudenken, wenn einige Dinge, die im Setup deklariert wurden, den Zustand nicht wirklich beeinflussen, während andere es tun.
Irgendwann ändert jemand aus Frustration einfach let
a let!
(dasselbe ohne faule Auswertung), um ihre Spezifikation zum Laufen zu bringen. Wenn das klappt, wird eine neue Gewohnheit geboren: Wenn eine neue Spezifikation zu einer älteren Suite hinzugefügt wird und nicht funktioniert, wird die erste der Autor versucht, Ponyfransen an zufälligen Stellen anzubringen. let
Anrufe.
Schon bald sind alle Leistungsvorteile dahin.
2. Die spezielle Syntax ist für Nicht-rspec-Benutzer ungewohnt
Ich würde meinem Team lieber Ruby beibringen als die Tricks von rspec. Instanzvariablen oder Methodenaufrufe sind überall in diesem und anderen Projekten nützlich, let
Syntax wird nur in rspec nützlich sein.
3. Die "Vorteile" erlauben es uns, gute Designänderungen einfach zu ignorieren
let()
ist gut für teure Abhängigkeiten, die wir nicht immer wieder neu erstellen wollen. Es lässt sich auch gut mit subject
die es Ihnen ermöglicht, wiederholte Aufrufe von Methoden mit mehreren Argumenten zu beenden
Teure Abhängigkeiten, die oft wiederholt werden, und Methoden mit großen Signaturen sind beides Punkte, an denen wir den Code verbessern könnten:
- vielleicht kann ich eine neue Abstraktion einführen, die eine Abhängigkeit vom Rest meines Codes isoliert (was bedeuten würde, dass weniger Tests sie benötigen)
- vielleicht macht der zu testende Code zu viel
- vielleicht muss ich intelligentere Objekte anstelle einer langen Liste von Primitiven einfügen
- Vielleicht habe ich gegen das Verbot verstoßen, etwas zu sagen, aber nicht zu fragen.
- vielleicht kann der teure Code schneller gemacht werden (seltener - hier ist Vorsicht vor voreiliger Optimierung geboten)
In all diesen Fällen kann ich das Symptom schwieriger Tests mit einem beruhigenden Balsam aus rspec-Magie bekämpfen, oder ich kann versuchen, die Ursache zu beseitigen. Ich habe das Gefühl, dass ich in den letzten Jahren viel zu viel Zeit mit Ersterem verbracht habe, und jetzt möchte ich besseren Code.
Um die ursprüngliche Frage zu beantworten: Ich würde es vorziehen, es nicht zu tun, aber ich verwende trotzdem let
. I meist es verwenden, um sich dem Stil des restlichen Teams anzupassen (es scheint, als ob die meisten Rails-Programmierer auf der Welt jetzt tief in ihrer rspec-Magie stecken, also ist das sehr oft der Fall). Manchmal verwende ich es, wenn ich einen Test zu einem Code hinzufüge, über den ich keine Kontrolle habe, oder keine Zeit für ein Refactoring zu einer besseren Abstraktion habe: d.h. wenn die einzige Option das Schmerzmittel ist.