Как проверить локальность шаблона рендера в rspec - PullRequest
5 голосов
/ 13 января 2012

Интересно, как проверить локальные данные, переданные шаблону рендеринга в контроллере

Контроллер:

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

Текущая спецификация:

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

Теперь мне нужно закончитьRcov для этого контроллера, поэтому мне нужно добавить / изменить спецификацию, чтобы охватить оба результата 'some_condition'.и я хочу проверить локальные значения 'lelf_panel', переданные для рендеринга, как если бы я только проверял render_template, частичная страница, отображаемая для обоих результатов, была одинаковой.http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template

он предоставляет только 2-й параметр для сообщения, так как я могу проверить локальные данные, переданные для рендеринга?

Ответы [ 3 ]

17 голосов
/ 24 июля 2012

Вместо использования сопоставителя render_template можно использовать ожидание для объекта контроллера.

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
3 голосов
/ 21 мая 2016

То же, что и ответ @ ryan-ahearn с предложениями из комментария @ user2490003 - но все они включены в нечто более гибкое и для 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
1 голос
/ 13 января 2012

Насколько я знаю, нет способа напрямую проверить локальные данные для шаблона так, как вы описываете.

Вы можете изменить locals_hash на @locals_hash, а затем проверить результаты с помощью присваиваний (: locals_hash).

Или, вы можете использовать селекторы в результирующем HTML и проверить наличие некоторого показательного содержимого - например, если locals_hash влияет на заголовок страницы, проверьте, что результирующий заголовок страницы HTMLчто вы ожидаете.

...