Rspec:如何使用locals和params测试局部渲染?

时间:2013-11-01 15:33:47

标签: ruby-on-rails testing rspec bdd rspec-rails

我试图用Rspec测试控制器的这一部分:

def popup_company
  if params[:partial].present?
    render partial: "popup_company/pages", locals: { tab_filter: params[:tab_filter] }
  end
end

这是我的控制器规范来测试上面提到的部分:

controller.should_receive(:render).with({
:partial => 'popup_company/pages',
:locals => {tab_filter: params[:tab_filter]}
})

但是,我收到此错误:

undefined local variable or method `params'

伙计们,请你告诉我应该改变什么以克服这个错误。感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您的params是规范代码;它只是试图成为一个局部变量。放入您希望params[:tab_filter]包含的任何内容。

而且,一般来说,你不应该写测试 - oops我的意思是“例子” - 只是重复代码所说的。你不关心你的控制器调用部分;你关心控制器用包含某某值的HTML做出响应。

答案 1 :(得分:0)

所以params [:tab_filter]在你的请求中,所以它可能是你得到的。也就是说,你有类似的东西:

get :popup_company, tab_filter: 'XXXXX', partial: 'YYYYY'

在你的规范中。您应该为tab_filter参数创建一个变量随机值,并使用它来验证正在传递给渲染的适当值。像

这样的东西
tab_filter = SecureRandom.hex(10)
get :popup_company, tab_filter: tab_filter, partial: 'YYYYY'
controller.should_receive(:render).with({
  partial: 'popup_company/pages',
  locals: { tab_filter: tab_filter } })

或者,您可以使用render_template('popup_company/pages')规范来确认正在渲染模板,并根据渲染视图的内容测试选项卡过滤器。