Pregunta

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 de 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 ingresar este parámetro en mi variable params . Intenté asignar en todos los sabores diferentes:

  • asignar [: params] = {: sort_by = > 'nombre'}
  • asignar [: params] [: sort_by] = 'nombre'
  • ...

sin éxito hasta ahora. Cada idea es apreciada.

¿Fue útil?

Solución

Esto se debe a que no debe usar params en sus vistas.
La mejor manera en que lo veo es usar un ayudante.

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

Y en uno de sus 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 .

Otros consejos

Si es una prueba de controlador, entonces sería

controller.stub!(:params).and_return {}

Si es una prueba auxiliar, entonces sería:

helper.stub!(:params).and_return {}

Y es una prueba de vista que sería:

view.stub!(:params).and_return {}

Si recibe una advertencia como la siguiente.

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)

Puedes cambiarlo a

allow(view).to receive(:params).and_return({sort_by: 'name'})

La manera fácil es simplemente hacer esto:

helper.params = {:foo => '1', :bar => '2'}

Pero en general es mejor ser más integrador y no "trozo" valores cuando es factible. Así que prefiero usar pruebas de controlador con integrar_views . Luego, puede especificar sus parámetros para obtener y probar que todo el flujo funciona, desde enviar parámetros al controlador, hasta que el controlador los procese y, finalmente, procesarlos.

Por lo general, también prefiero extraer la lógica de vista en ayudantes, que puede ser más fácil de probar.

Por ejemplo, supongamos que tengo un ayudante llamado selection_list , que devuelve un Hash cuyo " selected_preset " La clave se basa en parámetros [: selected_preset] y su valor predeterminado es 42 si se especifica un valor vacío para el parámetro.

Aquí hay una prueba de controlador donde hemos llamado integrar_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 alertará si alguna parte de esta funcionalidad se rompe. Pero también me gustaría tener algunas pruebas de unidad para ayudarme a identificar esa rotura.

Comenzaré haciendo que el ayudante use una variable de instancia en lugar de acceder directamente a los parámetros. Cambiaré el código anterior agregando una sola línea directamente debajo de 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 para configurar los parámetros de vista:

controller.request.path_parameters[:some_param] = 'a value'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top