2015-06-23 3 views
1

У меня есть страница dashboard.html.erb, которая может быть перенаправлена ​​на несколько разных контроллеров/действий. Когда он получает перенаправление, он также получает несколько параметров URL.Rspec просмотр с параметрами url

код контроллера:

class PlansController 
    def some_action 
    redirect_to dashboard_path(show: "default", cool_array: ["test", "test"]) 
    end 
end 

class StaticpagesController 
    def dashboard 
    end 
end 

Посмотреть код:

<% if cool_array %> 
    <% cool_array.each do |a| %> 
    <li><%= a %></li> 
    <% end %> 
<% end %> 

<script> 
var show = getParamFromURL("show") 
// some sort of function that returns the value of the show param, in this case, "default" 
if (show == "default") { 
    $("#default").addClass("show"); 
} else { 
    $("#other").addClass("hidden"); 
} 
</script> 

Поскольку это переадресовывает, тестирование контроллера с render_views не будет работать. Поэтому я подумал о том, чтобы построить мои тесты, чтобы контрольные спецификации проверяли, что передаются правильные параметры, а спецификация просмотра проверяет, что, если имеются определенные параметры, присутствуют правые классы css или что-то еще. Но, по моему мнению, у меня возникают проблемы с имитацией прохождения параметров.

Это, кажется, единственный другой вопрос на это, что я нашел: RSpec View testing: How to modify params?

Но ни одно из решений работали для меня; Я не уверен, что в этом случае мне нужен помощник ... который, кажется, немного надуманный ...

Я попытался (с привязанным SO вопроса выше):

before do 
    controller.request.path_parameters[:cool_array] = ["test","test"] 
end 
# => ActionView::Template::Error: 
# undefined local variable or method `cool_array' for #<#<Class:0x007fe2d9815100>:0x007fe2d90a62e8> 
# thrown by line in view file with <% if cool_array %> 

before do 
    view.stub(:params).and_return({cool_array: ["test", "test"]}) 
end 
# => ActionView::Template::Error: 
# undefined local variable or method `cool_array' for #<#<Class:0x007fe2d9815100>:0x007fe2d90a62e8> 
# thrown by line in view file with <% if cool_array %> 

helper.params = {:cool_array => ["test", "test"]]} 
# honestly not even sure this is right, because it can only go into a describe block (not a before, not an it) and then it throws: 
# NoMethodError: 
# undefined method `params=' for #<#<Class:0x007fd7cc8f4930>:0x007fd7cc8a5060> 

И все они терпят неудачу с:

ответ

0

Потому что это перенаправления, тестирование контроллера с помощью render_views будет не работать.

Нет, вы просто делаете это неправильно.

Если StaticpagesController#dashboard принимает параметры URL, вы должны проверить, как он реагирует на указанные параметры в спецификации контроллера для StaticpagesController.

RSpec.describe StaticpagesController, type: :controller do 
    describe 'GET #dashboard' do 
    render_views 
    it "does something with the x parameter" do 
     get :dashboard, x: 'hello!' 
     expect(response.body).to match 'hello!' 
    end 
    end 
end 

Аналогично, вы должны проверить, что PlansController # some_action содержит правильные параметры в ответе.

Я бы сказал, что проблемы вашего вида указывают на то, что у вас есть запах кода в ваших взглядах. В MVC ваши контроллеры несут ответственность за ввод данных и передачу их в представления и модели. Изоляция ваших представлений от прямого обращения к параметрам означает, что обрабатываемый параметр не дублируется по всему вашему приложению.

Используйте в своих контроллерах locals, чтобы передать переменные вашим представлениям и избегать использования params в ваших представлениях.

Это делает для лучшего дизайна и более легких тестов:

describe "rendering locals in a partial" do 
    it "displays the widget" do 
    widget = stub_model(Widget, :name => "slicer") 
    render :partial => "widgets/widget.html.erb", :locals => {:widget => widget} 
    rendered.should contain("slicer") 
    end 
end 
+0

OMG я так глупо ... Может быть, я работал слишком много ... но я совершенно забыл о тестировании Staticpages контроллер! Я говорил, что «render_views» не работает, потому что в спецификации PlansController я не могу сказать «assert_redirected_to controller:« staticpages », action:« dashboard », cool_array: [" test "," test "]', а затем далее следуйте за тем, чтобы перенаправить тест на просмотр ... но, очевидно, я просто подобрал бы с помощью контроллера Staticpages ... gah теперь я чувствую себя очень глупо – james

Смежные вопросы