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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top