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'