ruby-on-rails - rspec rails
Prueba de la vista de RSpec: ¿cómo modificar params? (4)
Eso es porque no deberías estar usando params
en tus puntos de vista.
La mejor forma en que lo veo es usar un ayudante.
<div>Sorted by <%= sorted_by %></div>
Y en uno de tus archivos de ayuda
def sorted_by
params[:sorted_by].capitalize
end
Entonces puede probar sus ayudantes con bastante facilidad (porque en las pruebas de ayudantes, puede definir la solicitud de params
.
Estoy tratando de probar mis puntos de vista con RSpec. La vista particular que me está causando problemas cambia su apariencia dependiendo de un parámetro url:
link_to "sort>name", model_path(:sort_by => ''name'')
que da como resultado http://mydomain/model?sort_by=name
Mi vista luego usa este parámetro así:
<% if params[:sort_by] == ''name'' %>
<div>Sorted by Name</div>
<% end %>
El RSpec se ve así:
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
Me gustaría probar mi vista (sin controlador) en RSpec pero no puedo obtener este parámetro en mi variable params
. Intenté assign
en todos los diferentes sabores:
-
assign[:params] = {:sort_by => ''name''}
-
assign[:params][:sort_by] = ''name''
- ...
ningún éxito hasta el momento. Cada idea es apreciada.
Si es una prueba de controlador, entonces sería
controller.stub!(:params).and_return {}
Si es una prueba de ayuda, entonces sería:
helper.stub!(:params).and_return {}
Y es una prueba de vista sería:
view.stub!(:params).and_return {}
La manera fácil es simplemente hacer esto:
helper.params = {:foo => ''1'', :bar => ''2''}
Pero, en general, es mejor tener más valores de integración y no de "stub" cuando sea posible. Por lo tanto, prefiero usar pruebas de controlador con integrate_views . Luego puede especificar sus parámetros para el get , y probar que todo el flujo funciona, desde el envío de params al controlador, hasta que el controlador los procese, y finalmente a la representación.
En general, también prefiero eliminar la lógica de vista en ayudantes, que pueden ser más fáciles de probar.
Por ejemplo, supongamos que tengo un ayudante llamado selection_list , que devuelve un hash cuya "selected_preset" clave depende de params [: selected_preset] , y por defecto es 42 si se especifica un valor vacío para el param.
Aquí hay una prueba de controlador a la que llamamos integrate_views (por supuesto, podría hacer lo mismo con una prueba de vista real, si le interesa).
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
Esta prueba de integración me avisará si parte de esta funcionalidad se rompe. Pero también me gustaría tener algunas pruebas de unidad para ayudarme a identificar esa rotura.
Empezaré haciendo que el ayudante use una variable de instancia en lugar de acceder directamente a params. Cambiaré el código anterior agregando una sola línea directamente debajo del get, de la siguiente manera:
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
Ahora también puedo realizar fácilmente una prueba de unidad auxiliar:
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
Otro método de configuración de parámetros de visualización:
controller.request.path_parameters[:some_param] = ''a value''