ruby-on-rails RSpec View测试:如何修改params?

yeotifhr  于 9个月前  发布在  Ruby
关注(0)|答案(5)|浏览(77)

我试着用RSpec测试我的观点。导致我麻烦的特定视图会根据url参数改变其外观:
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看起来像这样:

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'
  • ...

目前还没有成功。每一个想法都受到赞赏。

vptzau2j

vptzau2j1#

如果是控制器测试,

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

如果它是一个辅助测试,那么它将是:

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'})
pxq42qpu

pxq42qpu2#

这是因为你不应该在视图中使用params
我认为最好的办法是找个帮手。

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

在你的一个助手文件里

def sorted_by
    params[:sorted_by].capitalize
end

这样就可以很容易地测试helper(因为在helper测试中,可以定义params请求)。

qoefvg9y

qoefvg9y3#

简单的方法就是这样做:

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

但一般来说,在可行的情况下,最好是更多的集成,而不是“存根”值。所以我更喜欢使用控制器测试和integrate_views。然后,您可以将参数指定给get,并测试整个流程是否正常工作,从将参数发送到控制器,到控制器处理它们,最后到渲染。
我通常也喜欢将视图逻辑提取到helper中,这样更容易测试。
例如,假设我有一个名为selection_list的助手,它返回一个Hash,其“selected_preset”键依赖于params[:selected_preset],如果为参数指定了空值,则默认值为42。
这里有一个控制器测试,我们调用了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

如果此功能的某些部分中断,此集成测试将提醒我。但我也希望有一些 * 单元 * 测试来帮助我 * 查明 * 这种破坏。
我将首先让助手使用一个示例变量,而不是直接访问参数。我将通过在get下面直接添加一行代码来更改上面的代码,如下所示:

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

现在我也可以轻松地执行一个helper单元测试:

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
dgjrabp2

dgjrabp24#

另一种设置视图参数的方法:

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

3ks5zfa05#

公认的答案是好的,在视图中使用参数是不好的。但是(现在)有一种记录在案的方法来做到这一点,因此,公认的答案实际上并没有回答这个问题。

controller.extra_params = { id: widget.id }

参见:https://rspec.info/features/6-0/rspec-rails/view-specs/view-spec/

相关问题