如何在rspec中验证渲染模板的本地化

Gz *_*ain 6 rspec ruby-on-rails rspec-rails

我想知道如何验证传递给控制器​​中渲染模板的本地人

控制器:

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
Run Code Online (Sandbox Code Playgroud)

当前规格:

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

现在我需要为这个控制器完成Rcov,所以我需要添加/修改规范以涵盖'some_condition'结果.我想验证传递给渲染的'lelf_panel'本地,好像我只验证了render_template,为两个结果渲染的部分页面是相同的.

我在http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template中查看rspec文档中的'render_template'

它只提供消息的第二个参数,那么如何测试传递给渲染的本地?

Rya*_*arn 18

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
Run Code Online (Sandbox Code Playgroud)


Cez*_*ski 5

与 @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
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个是最有用的,但是,我确实必须更改块签名,因为至少在我的 Rails 版本(3.2,不要问;)中它传递了正在呈现的方法的名称。例如,在我的控制器中,我有 `render "index", locals: { Presenter: Presenter }`,在我的规范中,我现在有 `expect(controller).to have_received(:render) do |_method, options| ` ..休息是一样的。 (2认同)

eli*_*jah 3

据我所知,无法按照您描述的方式直接检查当地人的模板。

您可以将 locals_hash 更改为@locals_hash,然后通过 allocates( :locals_hash) 检查结果。

或者,您可以在生成的 HTML 上使用选择器,并检查是否存在某些指示性内容 - 例如,如果 locals_hash 影响页面标题,请检查生成的 HTML 页面标题是否符合您的预期。