RSpec Посмотреть тестирование: как изменить параметры?

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

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

Ответ 1

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

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

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

def sorted_by
    params[:sorted_by].capitalize
end

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

Ответ 2

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

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

Ответ 3

Простым способом является просто:

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

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

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

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

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

Ответ 4

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

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