2013-05-16 19 views
11

ich mein Controller testen können mitRspec Test zu machen, kein Layout

expect { get :index }.to render_template(layout: 'my_layout') 

ein bestimmtes Layout zu machen, aber wie kann ich testen Sie die Steuerung kein Layout zu machen?

Die folgende erste Erwartung besteht, , aber seien Sie vorsichtig: die zweite Erwartung geht auch! (Prüfung den gleichen Code)

expect { get :index }.to render_template(layout: false) 
expect { get :index }.to render_template(layout: true) 

Im November 2008 @ david-Chelimsky sagte:

Ein Weg, ich behandelt habe dies erfolgreich für dieses ein Beispiel integrate_views ist (in seiner eigenen Gruppe) und geben Sie an, dass HTML-Elemente aus dem Layout nicht im Formular vorhanden sind. Es ist ein sprödes Beispiel, aber es ist nur eins.

Ich möchte die gerenderte Ansicht nicht überprüfen, aber bisher habe ich keine bessere Lösung gefunden.

Hat jemand einen guten Ansatz?

Antwort

3

Während kein schönes Motto (Sie immer eine Hilfsmethode hinzufügen) wird geladen, ich habe festgestellt, dass Sie dies tun können:

get :index 
@templates.keys.should include(nil) 

getestet habe ich diese und es funktioniert nur, wenn ich layout false gesetzt. Basierend auf der implementation of assert_template sammelt es einige Informationen in Instanzvariablen. Die relevanten sind @templates und @layouts - jeder ist ein Hash-Wert, der durch eine Zeichenkette kodiert wird, die der Anzahl entspricht, wie oft er gerendert wurde.

@templates enthält die für Ihre Aktion verwendete Vorlage (z. B. "users/show"), aber @layouts zeigt nur Layouts an. Wenn kein Layout verwendet wurde, sieht es wie {nil=>1} aus. Dies scheint das einzige Ding zu sein, auf das Sie tippen können.

Also vielleicht könnte es schön sein, eine Hilfsmethode oder custom matcher zu machen, um dies zu tun.

+0

Danke dafür, ich ging mit der Zeile '@layouts.keys.should == [nil] 'für meinen Code (für jetzt). Vielleicht kreisen Sie zurück für einen kundenspezifischen Matcher, sobald dieses Problem wieder auftaucht :) – Phantomwhale

+0

Froh, dass Sie etwas zur Arbeit haben. Denken Sie daran, dies als die Antwort zu markieren, damit zukünftige Besucher wissen, dass es funktioniert hat! – MrDanA

+0

Ach, nicht meine Frage, sonst würde ich :) – Phantomwhale

5

In meinen Tests, wenn kein Layout überprüfe ich nur, wenn es nicht „Anwendung“ Layout

expect { get :index }.to_not render_template(layout: "application") 
+2

Wenn es eine andere Vorlage geladen wäre dies eine falsche positive passieren und sein. – MrDanA

+0

Wie ich schon sagte, es ist nur zu prüfen, ob es nicht "Anwendung" lädt. Wenn es eine Antwort gibt, die das auf eine korrekte Weise löst, werde ich es auch übernehmen :) –

-1

Ich habe es mit diesem Motto

expect { get :index }.to render_template(layout: []) 

Versionen: Rspec = 3.4.0, Rails ~> 4.2.5

+0

Dies funktioniert tatsächlich nicht (oder erstellt falsch positive Ergebnisse könnten genauer sein). Wenn Sie Ihr Layout auf der Controller-Ebene definieren - also "Layout", was auch immer "außerhalb jeder Aktionsmethode - und dann nur" render layout: false "für alle Aktionen verwenden, bei denen * kein Layout verwendet werden soll (Wenn Sie beispielsweise ein Modal verwenden, gilt dieser Test für alle Ihre Aktionen. – jeffdill2