Actualmente estoy luchando un poco tratando de mantener las especificaciones de mi controlador seco y sucinta y reduce a una afirmación por ejemplo. Me encuentro con algunas dificultades, especialmente con dónde colocar la llamada de solicitud de controlador real dentro de una estructura anidada para que coincida con los diversos casos extremos.especificaciones del controlador seco con RSpec
He aquí un ejemplo simplificado para demostrar el problema:
describe MyController do
let(:item) { Factory(:item) }
subject { response }
describe "GET #show" do
before(:each) do
get :show
end
context "published item" do
it { should redirect_to(success_url) }
end
context "unpublished item" do
before(:each) do
item.update_attribute(published: false)
end
it { should redirect_to(error_url) }
end
end
end
Es evidente que esto es un ejemplo artificial, pero que ilustra lo que me gustaría hacer y lo que no funciona. Principalmente, el problema es el bloque before
en el contexto "no publicado". Lo que pasa es que el cambio que hice a los datos de configuración que realmente sucede después la llamada get
debido a la forma en que los contextos están anidados, por lo que el ejemplo en ese contexto está trabajando realmente con el escenario inicial en lugar de la que yo propongo.
entiendo por qué sucede esto y cómo los contextos nido. Creo que lo que había como tener alguna manera de decirle RSpec lo que me gustaría que se ejecute justo después cualquier before
ganchos sin embargo, justo antes de cualquier afirmación en un contexto dado. Esto sería perfecto para las especificaciones del controlador. Me gustaría aprovechar anidando en mi especificaciones del controlador para construir gradualmente las variaciones de los casos límite, sin tener que dispersar la llamada get
o incluso una llamada a un ayudante do_get
en cada una de mis afirmaciones it
. Esto sería especialmente molesto para mantenerme sincronizado con cualquier macro personalizada it_should
que estoy usando.
¿Hay algo en RSpec actualmente para lograr esto? ¿Hay algún truco que pueda usar para acercarme? Parecería perfectamente adecuado para la forma en que he visto a mucha gente escribiendo las especificaciones de su controlador; por lo que he encontrado, la gente básicamente se conformó con que se llamara a los asistentes do_get
antes de cada afirmación. ¿Hay una mejor manera?
Buen punto. La verbosidad adicional puede valer la pena para mantener las especificaciones claras, incluso si la llamada 'get' todavía se repite. Aún así, parece que las especificaciones del controlador, que tienen un caso de uso muy específico para especificar una respuesta a una acción REST, de alguna manera podrían reducir dicha repetición. –
Chris - Estoy de acuerdo en que algún tipo de atajo sería agradable y estoy abierto a la idea, pero aún veo uno que mantiene lo que siento es un nivel adecuado de claridad. Si tiene alguna idea, por favor envíe una solicitud de función a https://github.com/rspec/rspec-rails/issues. –