Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to validate locals of render template in rspec

I wonder how to validate the locals passed to render template in 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

Current Spec:

it 'should render correct template for lelf_panel' do
  # ... 
  get 'left_panel'
  response.should render_template('system/_left_panel')
end   

Now I need to finish Rcov for this controller so I need to add/modify spec to cover both 'some_condition' results. and I want to validate 'lelf_panel' locals passed to render, as if I only validate the render_template, partial page rendered for both result are the same.

I check the 'render_template' in rspec docs in http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template

it only provide and 2nd params for message, so how can I test the locals passed to render?

like image 801
Gz Rain Avatar asked Jan 12 '12 23:01

Gz Rain


2 Answers

as far as I know, there is no way to directly examine the locals for a template in the way you're describing.

You could change locals_hash to @locals_hash and then examine the results through assigns( :locals_hash).

Or, you could use selectors on the resulting HTML and check that some indicative content is there -- for instance, if locals_hash affects the title of the page, check that the resulting HTML page title is what you expect.

like image 122
elijah Avatar answered Oct 20 '22 11:10

elijah


Instead of using the render_template matcher, you can use an expectation on the controller object.

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
like image 27
Ryan Ahearn Avatar answered Oct 20 '22 11:10

Ryan Ahearn