_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.
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
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:
Si este es un patrón común que necesita, puede crear un pequeño método DSL para él:
Entonces puedes usar este método así:
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 :).