2009-11-26 74 views
10

我想用RSpec来测试我的视图。RSpec查看测试:如何修改params?

link_to "sort>name", model_path(:sort_by => 'name')导致http://mydomain/model?sort_by=name

我的看法,然后使用这个参数那样:

<% if params[:sort_by] == 'name' %> 
<div>Sorted by Name</div> 
<% end %> 

RSpec的样子,是造成我的烦恼特定视图取决于URL参数改变其外观这个:

it "should tell the user the attribute for sorting order" do 
    #Problem: assign params[:sort_for] = 'name' 
    render "/groups/index.html.erb" 
    response.should have_tag("div", "Sorted by Name") 
end 

我想在RSpec中测试我的视图(没有控制器),但我不能得到这个参数呃进入我的params变量。我试图在所有不同的口味assign

  • assign[:params] = {:sort_by => 'name'}
  • assign[:params][:sort_by] = 'name'
  • ...

没有成功为止。每一个想法是赞赏。

回答

10

这是因为你不应该在你的意见中使用params
我看到它使用助手的最佳方式。

<div>Sorted by <%= sorted_by %></div> 

而在你的帮助文件中的一个

def sorted_by 
    params[:sorted_by].capitalize 
end 

然后你就可以很方便地测试你的助手(因为在助手的测试,你可以定义params请求。

+0

不是我所期望的,但它解决了我的问题并改进了我的应用程序。谢谢! – sebastiangeiger 2009-11-26 10:53:50

33

如果它的控制器测试那么它将是

controller.stub!(:params).and_return {} 

如果它的帮助测试那么它会b E:

helper.stub!(:params).and_return {} 

而且其视图测试将是:

view.stub!(:params).and_return {} 

如果你被警告象下面这样。

Deprecation Warnings: 

Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from /home/akbarbin/Documents/Office/projects/portfolio/spec/views/admin/waste_places/new.html.erb_spec.rb:7:in `block (2 levels) in <top (required)>'. 


If you need more of the backtrace for any of these deprecations to 
identify where to make the necessary changes, you can configure 
`config.raise_errors_for_deprecations!`, and it will turn the 
deprecation warnings into errors, giving you the full backtrace. 

1 deprecation warning total 

Finished in 4.86 seconds (files took 4.72 seconds to load) 

你可以把它变成

allow(view).to receive(:params).and_return({sort_by: 'name'}) 
+0

我发现这个很有帮助,但是我使用了Rspec 3语法:'allow(view).to receive(:params).and_return({action:'index'})' – 2015-09-25 19:14:21

5

最简单的办法是只做到这一点:

helper.params = {:foo => '1', :bar => '2'} 

但一般来说,最好是更多的整合-Y,而不是“存根“值的时候是可行的。所以我更愿意使用integrate_views的控制器测试。然后你可以指定你的参数为得到,并测试整个流程,从发送params到控制器,让它们由控制器处理,最后到渲染。

我一般还喜欢将视图逻辑拉入助手,这可以更容易测试。

例如,说我有一个称为selection_list帮手,它返回一个散列其“selected_preset”键依赖于PARAMS:如果对于参数是指定一个空值,默认值为42 [selected_preset]。

这里是一个控制器测试,我们称之为integrate_views(当然,你也可以用一个实际的视图测试做同样的事情,如果你喜欢的话)。

describe '#show' do 
    describe 'selected_preset' do 
    it 'should default to 42 if no value was entered' do 
     get :show, :params => {:selected_preset => ''} 
     response.template.selection_list[:selected_preset].should == 42 

如果此功能的某些部分发生中断,此集成测试将提醒我。但我也希望有一些单位测试,以帮助我确定破损。

我将首先让助手使用实例变量而不是直接访问参数。我将通过添加正下方的得到一个单一的线改变上面的代码,如下所示:

describe '#show' do 
    describe 'selected_preset' do 
    it 'should default to 42 if no value was entered' do 
     get :show, :params => {:selected_preset => ''} 
     assigns[:selected_preset].should == 42 # check instance variable is set 
     response.template.selection_list[:selected_preset].should == 42 

现在我也可以容易地执行一个辅助单元测试:

describe MyHelper do 
    describe '#selection_list' do 
    it 'should include the selected preset' do 
     assigns[:selected_preset] = 3 
     helper.selection_list[:selected_preset].should == 3 
+0

现在看来“integrate_views”现在已被弃用“render_views”。 https://relishapp.com/rspec/rspec-rails/v/2-1/docs/controller-specs/render-views – 2018-02-07 22:24:50

1

设定图的另一种方法params:

controller.request.path_parameters[:some_param] = 'a value'