Rspec-core: Ejecute la misma especificación varias veces con diferentes filtros

Creado en 8 oct. 2011  ·  3Comentarios  ·  Fuente: rspec/rspec-core

_Descargo de responsabilidad: esta solicitud se deriva específicamente de realizar pruebas de aceptación de JavaScript con Capybara. Aunque puedo ver casos de uso para otras situaciones.

Todas mis aplicaciones están codificadas para que funcionen bien con JS desactivado, pero con JS desactivado, obtienes muchas campanas y silbidos agradables para hacer que la experiencia del usuario sea más agradable. Debido a esto, desde el punto de vista del usuario, las interacciones en la mayoría de las cosas son idénticas; sin embargo, quiero probar que funciona con JS y sin JS.

Lo que me gustaría es poder establecer algún tipo de bandera para decirle a RSpec que ejecute la misma especificación dos veces con cada conjunto de filtros. Algo como:

it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
    # stuff here
end

Sé que esto se puede lograr con ejemplos compartidos, pero el código resultante no es muy elegante.

Además, podría usarse si desea probar sin JS (prueba de rack) con JS en Firefox (Selenium) y con JS en Webkit (capybara-webkit) de esta manera:

it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
    # stuff here
end

También estoy imaginando una forma de usar filtros personalizados para especificar las opciones run_with para que no sea tan detallado como:

it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
    # stuff here
end

¿Pensamientos? Revisé los documentos y el código y no vi una forma de hacer esto actualmente con filtros.

Comentario más útil

Los filtros no están realmente diseñados para hacer esto de inmediato, pero no es difícil obtener el comportamiento que está solicitando sin que hagamos cambios en RSpec:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

Si este es un patrón común que necesita, puede crear un pequeño método DSL para él:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

Entonces puedes usar este método así:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

Creo que esto es bastante elegante. Cambiar cómo funcionan los filtros para hacer lo que está pidiendo sería un cambio bastante significativo que agregaría una carga de mantenimiento futura al equipo de RSpec para una característica que esperaría que se use con poca frecuencia, por lo que mi instinto es no agregar esto al núcleo .

Dicho esto, si desea crear una gema rspec-multi-filters que proporcione esta funcionalidad, no dude en :).

Todos 3 comentarios

Los filtros no están realmente diseñados para hacer esto de inmediato, pero no es difícil obtener el comportamiento que está solicitando sin que hagamos cambios en RSpec:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

Si este es un patrón común que necesita, puede crear un pequeño método DSL para él:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

Entonces puedes usar este método así:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

Creo que esto es bastante elegante. Cambiar cómo funcionan los filtros para hacer lo que está pidiendo sería un cambio bastante significativo que agregaría una carga de mantenimiento futura al equipo de RSpec para una característica que esperaría que se use con poca frecuencia, por lo que mi instinto es no agregar esto al núcleo .

Dicho esto, si desea crear una gema rspec-multi-filters que proporcione esta funcionalidad, no dude en :).

@myronmarston como de costumbre, era solo mi ignorancia de lo que RSpec podía hacer. Gracias por tomarse el tiempo y aclarar. Creo que esto funcionará muy bien. :)

: +1: impresionante

¿Fue útil esta página
0 / 5 - 0 calificaciones