So validieren Sie Einheimische der Render -Vorlage in RSPEC
-
27-10-2019 - |
Frage
Ich frage mich, wie man die Einheimischen validiert
Regler:
def lelf_panel
# ...
if some_condition
locals_hash = some_very_long_hash_A
else
locals_hash = some_very_long_hash_B
end
render :partial => "left_panel", :layout => false, :locals => locals_hash
end
Aktuelle Spezifikation:
it 'should render correct template for lelf_panel' do
# ...
get 'left_panel'
response.should render_template('system/_left_panel')
end
Jetzt muss ich RCOV für diesen Controller beenden, damit ich die Spezifikation hinzufügen/ändern muss, um beide Ergebnisse von "slow_condition" abzudecken. Und ich möchte die an das Rendern übergebenen "lelf_panel" -Dookale validieren, als ob ich nur die render_template validieren würde, die teilweise Seite für beide Ergebnisse sind gleich.
Ich überprüfe die 'render_template' in RSPEC -Dokumenten inhttp://rubydoc.info/gems/rspec-ils/2.8.1/rspec/rails/Matchers/rendertemplate:render_template
Es bietet nur 2nd Params für die Nachricht. Wie kann ich also die Einheimischen testen, die an das Rendern übergeben wurden?
Lösung
Soweit ich weiß, gibt es keine Möglichkeit, die Einheimischen direkt auf eine Vorlage zu untersuchen, wie Sie beschreiben.
Sie können locals_hash in @Locals_hash ändern und dann die Ergebnisse durch Zuweisungen (: locals_hash) untersuchen.
Sie können auch Selektoren für das resultierende HTML verwenden und überprüfen, ob ein indikativer Inhalt vorhanden ist. Wenn Sie beispielsweise den Titel der Seite beeinflussen, überprüfen Sie, ob Sie erwarten, dass der resultierende HTML -Seitentitel das ist, was Sie erwarten.
Andere Tipps
Anstatt die zu verwenden render_template
Durch Match können Sie eine Erwartung am Controller -Objekt verwenden.
it 'should render correct template for lefl_panel' do
# ...
allow(controller).to receive(:render).with no_args
expect(controller).to receive(:render).with({
:partial => 'system/_left_panel',
:layout => false,
:locals => some_very_long_hash_A
})
get 'left_panel'
end
Wie @Ryan -Aahearns Antwort mit Vorschlägen des Kommentars von @user2490003 - aber alle in etwas Flexibleres und für RSPEC 3 gesetzt.
# Safe to set globally, since actions can either render or redirect once or fail anyway
before do
allow(controller).to receive(:render).and_call_original
end
describe "get left panel" do
before do
# other setup
get 'left_panel'
end
it 'should render correct template for lelf_panel' do
# Sadly, render_template is primitive (no hash_including, no block with args, etc.)
expect(subject).to render_template('system/_left_panel')
end
it 'should render with correct local value' do
expect(controller).to have_received(:render) do |options|
expect(options[:locals][:key_from_very_long_hash]).to eq('value_of_key_from_very_long_hash')
end
end
end