Hola,
it “debe asignar a la vista los clubes encontrados” do
assigns[:clubs].should == Club.find(:all)
get ‘index’
end
Como estás probando el controlador, y lo que quieres es comprobar que,
al ejecutarse, asigna el resultado de “Club.find(:all)” a @clubs, has de
hacerlo al revés:
it “debe asignar a la vista los clubes encontrados” do
get ‘index’
assigns[:clubs].should == Club.find(:all)
end
Primero lo ejecutas, luego compruebas que, en efecto, assigns[:clubs]
tiene lo que deberÃa.
De todas formas, lo que estás haciendo es probar contra la base de datos
con Club.find(:all). Lo suyo es testear en isolation, y para eso puedes
usar mocking y stubbing. Yo harÃa primero lo siguiente:
describe ClubsController do
before(:each) do
@club = mock_model(Club)
@clubs = [@club]
Club.stub!(:find).and_return(@clubs)
end
…
Con eso te aseguras que, antes de cada spec, se hace un stub de
Club.find que devuelve un array con un club de prueba (recuerda que aquÃ
no estás probando los clubs, solo el controlador, asà que lo que hacen
los clubs te deberÃa dar igual). AsÃ, cuando haces get :index, usará lo
que has definido en el before block y no lo que hay en la base de datos.
Luego en:
it “debe buscar todos los clubes” do
Club.should_receive(:find).with(:all).and_return(@clubs)
get ‘index’
end
Aquà lo que le estás diciendo es: “olvÃdate del stub que creé. lo que
quiero es que ahora compruebes que en efecto, Club recibe (:find) con
(:all) y devuelve (@clubs)”. Y la última parte (and_return), en realidad
es como decirle “no ejecutes la llamada, solo devuelve mi instance
variable @clubs”.
Y por último:
it "debe asignar a la vista los clubes encontrados" do
get 'index'
assigns[:clubs].should == @clubs
end
AquÃ, como tienes un stub de :find, que devuelve @clubs, al ejecutar
index va a usar tu @clubs para asignarlo a la vista. Solo tienes que
comprobar que en efecto es asÃ.
No he probado el código, pero en conjunto tendrÃa esta pinta:
http://www.pastie.org/218663
Saludos,
Jorge
Carlos Belizón wrote:
Llevo buscando un buen tiempo algun tutorial o manual que explique bien
qué es un Stub y un Mock y cómo aplicarlos pero no encuentro algo que me
despeje las dudas. He reescrito desde cero el fichero que testea mi
controlador Clubs y me ha quedado asÃ:
describe ClubsController do
describe “Petición GET /index” do
it “debe ser exitosa” do
get ‘index’
response.should be_success
end
it "debe buscar todos los clubes" do
Club.should_receive(:find).with(:all).and_return(@clubs)
get 'index'
end
it "debe renderizar la plantilla index" do
get 'index'
response.should render_template('index')
end
it "debe asignar a la vista los clubes encontrados" do
#aquà no sé que poner :S
end
end
end
Como véis es la acción index por defecto que te genera un scaffold de
Rails y no sé cómo puedo testear que lo que se muestra en la vista es lo
mismo que he cargado en el controlador, he probado poniendo esto:
it “debe asignar a la vista los clubes encontrados” do
assigns[:clubs].should == Club.find(:all)
get ‘index’
end
pero me lanza el sigueinte error:
-
NoMethodError in ‘ClubsController Petición GET /index debe asignar a la
vista los clubes encontrados’
You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.include?
/home/carlos/NetBeansProjects/ofs/spec/controllers/clubs_controller_spec.rb:22:
¿Alguien me echa una mano?