Controller-Instanzvariablen mit Rack :: Test und Sinatra testen

8

Ich habe eine Sinatra-App, die Seiten als schreibgeschützt oder editierbar anbietet, abhängig davon, ob der Benutzer angemeldet ist.

Der Controller legt eine Variable @can_edit fest, die von den Ansichten verwendet wird, um Bearbeitungslinks zu verbergen / anzuzeigen. Wie kann ich den Wert von @can_edit in meinen Tests testen? Ich habe keine Ahnung, wie ich unter Rack :: Test zur aktuellen Instanz des Controllers komme.

Ich benutze class_eval , um die Methode logged_in? im Controller auszugeben, aber ich muss auf last_response.body für meine Bearbeitungslinks zurückgreifen, um zu sehen, ob @can_edit gesetzt wurde oder nicht.

Wie kann ich den Wert von @can_edit direkt testen?

    
Brian 18.12.2009, 15:46
quelle

3 Antworten

8

Leider glaube ich nicht, dass dies ohne Änderung von Rack :: Test möglich ist. Wenn Sie während des Anwendungstests eine Anforderung eingeben, führt Rack :: Test Folgendes aus:

  1. fügt die Anfrage zu einer Liste der letzten Anfragen hinzu
  2. erstellt eine neue Instanz Ihrer Anwendung und ruft die Methode call
  3. auf
  4. fügt die Antwort Ihrer Anwendung einer Liste der letzten Antworten hinzu

Es ist einfach, auf last_request und last_response zuzugreifen, aber leider werden keine Informationen über den Status Ihrer Anwendung gespeichert, während sie ausgeführt wird.

Wenn Sie daran interessiert sind, einen Rack :: Test-Patch zu hacken, sehen Sie sich zunächst rack-test/lib/rack/mock_session.rb in Zeile 30 an. Hier führt Rack :: Test Ihre Anwendung aus und erhält die standardmäßigen Rack-App-Rückgabewerte (Status, Header, Körper). Meine Vermutung ist, dass Sie auch Ihre Anwendung modifizieren müssen, um alle ihre Instanzvariablen zu sammeln und zugänglich zu machen.

In jedem Fall ist es am besten, nach Ergebnissen zu suchen, nicht nach Implementierungsdetails. Wenn Sie sicherstellen möchten, dass ein Bearbeitungslink nicht sichtbar ist, testen Sie, ob der Bearbeitungslink über die DOM-ID vorhanden ist:

%Vor%     
Alex Reisner 18.12.2009, 16:38
quelle
4

Es ist möglich mit einem kleinen Hack. Die Instanzen der Sinatra-App sind nicht verfügbar, da sie beim Aufruf von Sinatra :: Base # erstellt werden. wie Alex erklärte. Dieser Hack bereitet eine Instanz auf ahead vor und lässt sie beim nächsten Aufruf greifen.

%Vor%

Ich habe diese Technik herausgefunden, die Instanz vorzutäuschen, die den aktuellen Test ausführt .

    
Shuhei Kagawa 27.12.2011 12:08
quelle
0

Hier ist eine fiese aber lebensfähige Alternative

%Vor%

Dies ermöglicht es Ihnen, vor dem Filtern und / oder dem Zugriff auf Instanzvariablen, die für die Basisanwendung erstellt wurden, mit einem Sinatra zu testen.

    
lfender6445 24.02.2016 21:36
quelle

Tags und Links