Тестирование RSpec View: Как изменить параметры? - PullRequest
11 голосов
/ 26 ноября 2009

Я пытаюсь проверить свои взгляды с помощью 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'
  • ...

пока безуспешно. Каждая идея ценится.

Ответы [ 4 ]

34 голосов
/ 01 декабря 2009

Если это тест контроллера, то это будет

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'})
11 голосов
/ 26 ноября 2009

Это потому, что вы не должны использовать params в своих представлениях.
Лучший способ, как я вижу, использовать помощника.

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

И в одном из ваших вспомогательных файлов

def sorted_by
    params[:sorted_by].capitalize
end

Тогда вы можете довольно легко протестировать своих помощников (поскольку в тестах помощников вы можете определить запрос params.

5 голосов
/ 18 марта 2011

Самый простой способ это сделать:

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

Но в целом лучше быть более интегрированными, а не "тупыми" значениями, когда это возможно. Поэтому я предпочитаю использовать тесты контроллера с integrate_views . Затем вы можете указать свои параметры для get и проверить, что весь поток работает, от отправки параметров контроллеру до их обработки контроллером и, наконец, до рендеринга.

Я также обычно предпочитаю вытаскивать логику представления в помощники, которые легче проверить.

Например, скажем, у меня есть помощник по имени selection_list , который возвращает хэш, чей ключ "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

Этот интеграционный тест предупредит меня, если какая-то часть этой функции выйдет из строя. Но в идеале я также хотел бы провести несколько тестов unit , чтобы помочь мне точно определить эту поломку.

Я начну с того, что помощник будет использовать переменную экземпляра вместо прямого доступа к параметрам. Я изменю приведенный выше код, добавив одну строку непосредственно под 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

Теперь я также могу легко выполнить вспомогательный юнит-тест:

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
2 голосов
/ 17 апреля 2015

Другой способ настройки параметров просмотра:

controller.request.path_parameters[:some_param] = 'a value'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...