Come convalidare i locali del modello di rendering in RSPEC
-
27-10-2019 - |
Domanda
Mi chiedo come convalidare i locali passati al modello di rendering nel controller
Controller:
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
Specifiche attuali:
it 'should render correct template for lelf_panel' do
# ...
get 'left_panel'
response.should render_template('system/_left_panel')
end
Ora ho bisogno di finire RCOV per questo controller, quindi devo aggiungere/modificare le specifiche per coprire entrambi i risultati "Some_condition". E voglio convalidare i locali 'Lelf_Panel' passati per rendering, come se solo convalidassi il render_template, la pagina parziale resa per entrambi i risultati sono le stesse.
Controllo il "render_template" in RSpec docs inhttp://rubydoc.info/gems/rspec-rails/2.8.1/rspec/rails/matchers/rendertimplate:render_template
Fornisce solo e 2 ° parametri per il messaggio, quindi come posso testare i locali passati per il rendering?
Soluzione
Per quanto ne so, non c'è modo di esaminare direttamente i locali per un modello nel modo in cui stai descrivendo.
È possibile modificare LOCALS_HASH in @Locals_hash e quindi esaminare i risultati tramite Assegna (: Locals_hash).
Oppure, è possibile utilizzare i selettori sull'HTML risultante e verificare che ci siano alcuni contenuti indicativi - ad esempio, se Locals_hash influisce sul titolo della pagina, verificare che il titolo della pagina HTML risultante sia quello che ti aspetti.
Altri suggerimenti
Invece di usare il render_template
Mather, è possibile utilizzare un'aspettativa sull'oggetto controller.
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
Come la risposta di @Ryan -Ahearn con suggerimenti dal commento di @user2490003, ma tutti messi in qualcosa di più flessibile e per RSPEC 3.
# 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