[英]How to validate locals of render template in rspec
我想知道如何验证传递给控制器中渲染模板的本地人
控制器:
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中查看rspec文档中的'render_template'
它只提供消息的第二个参数,那么如何测试传递给渲染的本地?
您可以在控制器对象上使用期望,而不是使用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
与@ 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
据我所知,没有办法按照你描述的方式直接检查模板的本地人。
您可以将locals_hash更改为@locals_hash,然后通过assign(:locals_hash)检查结果。
或者,您可以在生成的HTML上使用选择器并检查是否存在某些指示性内容 - 例如,如果locals_hash影响页面的标题,请检查生成的HTML页面标题是否符合您的预期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.