In welcher Reihenfolge laufen RSpec vor, nach und um Hooks?

8

Als ich ein Problem sah, entschied ich mich, was einzuchecken Die Befehle before und after werden ausgeführt. Das habe ich gemacht:

%Vor%

und was ich habe:

%Vor%

Was geht hier vor ?? Warum wird after_each vor A_it_1 ausgeführt?

UPDATE:

das Hinzufügen von around(:each) macht noch mehr Spaß:

%Vor%

und Ergebnisse:

%Vor%     
pawel7318 22.05.2014, 15:40
quelle

2 Antworten

6

Ihre Ausgabe und die auf reliShop.com dokumentierte offizielle Ausgabe sind korrekt. Was passiert ist, dass rspec die after (: each) es nach jedem Beispiel ausführen muss, weil eine Ausnahme in einem after (: each) das Beispiel zum Scheitern bringen würde. Bevor rspec das Beispiel in der Ausgabe anzeigen kann, muss es wissen, ob es grün oder rot ist, was bedeutet, dass die after (: eaches) ausgeführt werden muss, bevor die Beschreibung des Beispiels in der Ausgabe erscheint.

Wenn Sie jedoch eine puts-Anweisung in Ihr aktuelles Beispiel einfügen, sehen Sie, dass die Vorher-Zeichen (: each) davor vorkommen, dann wird der Beispiel-Code ausgeführt (einschließlich der Puts), dann das Nachher-Zeichen (: each). es, wie Sie es erwarten, und schließlich wird die Beschreibung des Beispiels auf dem Bildschirm ausgegeben.

Wie du war ich auch verwirrt, bis ich merkte, dass rspec, das das Label des Beispiels druckt, nicht mit dem übereinstimmt, was es tatsächlich tut - das Label wird nur einmal alle vorher ausgedruckt (: alle), bevor ( : jedes) es, und nachdem (: jedes) es für das Beispiel ausgeführt wird.

Hinweis: nachdem (: alle) s ausgeführt werden, nachdem das Beispiellabel ausgedruckt wurde, weil sie das Ergebnis des Tests nicht beeinflussen (es wird eine Warnung generiert, dass in einem after (: all) -Hook eine Ausnahme aufgetreten ist, aber Dadurch wird ein Test nicht rot).

    
pstare 29.07.2014 14:37
quelle
4

Die RSpec-Dokumentation für before und after hooks gibt die Reihenfolge an, in der sie ausgeführt werden. Die Dokumentation von RSpec für around hooks funktioniert jedoch nicht Geben Sie nicht die Reihenfolge an, in der sie ausgeführt werden.

Diese Spezifikation testet die Reihenfolge, in der around , before und after :all und :each und Beispiele ausgeführt werden. Wenn ich es mit rspec (-core) 2.14.8 ausführe, werden sie in der Reihenfolge ausgeführt, die Sie erwarten:

%Vor%

Beachten Sie einige möglicherweise überraschende Dinge:

  • self unterscheidet sich in den Blöcken :all und :each , daher musste ich eine globale statt einer Instanzvariablen verwenden.
  • after :all (aber nicht before :all ) isst Ausnahmen.
  • schau dir all diese Orte an .should funktioniert! Nicht dass du es normalerweise dort benutzen willst.
Dave Schweisguth 22.05.2014 18:53
quelle

Tags und Links