Trabajando en una extensión para Spree, al generar controladores, por ej. con
rails g controller Fake show
el generador me genera(generalmente, las redundancias valen)
require 'spec_helper' describe FakeController do describe "GET 'show'" do it "returns http success" do get 'show' response.should be_success end end end
yo, viejo desarrollador Rake/Test (aónde..) pensé
harto fome rspec, sólo usa bloques en vez de métodos…
pero el test se caía con
Failure/Error: get 'show' ActionController::RoutingError: No route matches {:controller=>"fake", :action=>"show"}
en su momento para salir del paso, por ahí allé que podía incluir la sintaxis de Capybara en el spec/spec_helper.rb
Rspec.configure do |c| # ... c.include Capybara::DSL end
y así es como terminé reemplazando el primer test por algo así como
it "returns http success" do visit spree.fake_path response.should be_success end
lo cual pasaba (o eso creía) y con el tiempo fue creciendo esta big ball of mud
hasta que tuve que testear variables de sesión y me encontré con que siempre
session = {}
Capybara dice, no obstante, que no tiene acceso a los requests ni sesión de lo que deduje que éste mi problema era:
estar ejecutando los test con un framework y probando los resultados con otro (Rake/Test).
De hecho, investigando más, Capybara ya no funciona para los controladores – los cuales en RSpec ni siquiera renderean las vistas, por lo que hay que estar poniéndole
describe "algun test" do render_views #! it "el payaso dia.." do
– sino que desde su v.2 se incluye sólamente en los test declarados dentro de la carpeta spec/features (¿lo cual es igual a integración con Cucumber? tarea para la casa).
‘Jigsaw falling into place’ – como diría mi camarada CDV – me encuentro ahora separando los tests de cotroladores según su especificación que es en el fondo Rake/Test en bloques y con las expectations de Rspec, etc. – pero no Capybara,
bonnus track
ah claro, y para resolver el No route matches de más arriba (el culpable de todo ésto), sucede porque Spree es un Engine, por lo tanto sus rutas deben ser incluídas así
require 'spec_helper' routes { Spree::Core::Engine.routes } # !! describe FakeController do describe "..." do