rails ruby-on-rails rspec

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