Duda al trabajar con asociaciones en RSpec

Hola comunidad, tengo un pequeño problema que tal vez me surge por la
comprensión incorrecta del trabajo de los Mocks, el escenario es el
siguiente:

  1. Tendo 2 modelos: Aritulo y Comentario
  2. Un artículo tiene muchos comentarios y un comentario pertenece a un
    artículo
  3. Las asociaciones aun no he declarado las asociaciones

Entonces, quiero describir el comportamiento de la accion “show” del
controlador articulos, cuando este no tiene comentarios:


it “deberia tener 0 comentarios” do
Articulo.should_receive(:find).with(“1”).and_return(@articulo)
@articulo.should_receive(:comentarios).and_return([])
do_show
assigns[:articulo].should equal(@articulo)
assigns[:comentarios].should be_empty
end

En el controlador:

def show
@articulo = Articulo.find(params[:id])
@comentarios = @articulo.comentarios
end

La especificación pasa correctamente ya que el mock ‘articulo’ tiene
definido el metodo ‘comentarios’, entonces mi consulta es: porque no me
tira
ningun error si el metodo en el verdadero codigo aun no existe, es decir
la
asociacion no se ha definido(has_many :comentarios), o es que acaso un
mock
puede definir un metodo que no ha sido definido en la clase que esta
mockeando?. Me parece que me estoy rayando un poco, pero de todas
maneras en
una duda que tengo y algo que me preocupa, ya que yo no me doy cuenta
del
error hasta que vaya directamente al navegador e invoque a la acción del
controlador.

Creo que una de las salidas podría ser usar fixtures, pero trato de
evitar
los fixtures, porque creo que se hacen completo conforme las
asociaciones
van creciendo, bueno espero sus sugerencias, muchas gracias por su
tiempo.

Saludos.

Estoy empezando también con el tema de los “Mocks y Stubs” yempiezo a
sacar
algunas conclusiones de en que situaciones debería
usarlos o no.

Una de ellas es que si quiero hacer un test como el que pretendes hacer,
no debería usar mocks. Comprobar que un objeto llama correctamente a
uno de sus métodos utilizando mocks hará alejarme de ese objetivo,
ya que lo que conseguiré será simular dicha situación.

Es decir, en tu ejemplo, has simulado que el método :comentarios está
implementado y devuelve una array. Y esta claro que no se adapta al
objetivo de tu test.

Yo utilizo mocks para muchas otras situaciones: Para mockear objetos
que no son el centro de mi test, para verificar que la acción de un
controlador
me lleva a donde debe según el estado que predispongo a sus objetos,
simular métodos que aún no están implementados o la entrada de
información
que no pertenece al dominio de tu aplicación, etc…

Animo,
Juan.

El día 15/02/08, Ruben. D. [email protected] escribió:

2008/2/16 Juan G. [email protected]:

Yo utilizo mocks para muchas otras situaciones: Para mockear objetos
El día 15/02/08, Ruben. D. [email protected] escribió:

end
La especificación pasa correctamente ya que el mock ‘articulo’ tiene
los fixtures, porque creo que se hacen completo conforme las asociaciones

simplelogica.net

Personalmente creo que lo está realizando correctamente. En esa spec
está comprobando el método show, que simplemente tiene que rellenar
dos variables @articulo y @comentarios, por lo que el test está bien
realizado.

La existencia o no del método comentarios debería comprobarse en los
specs del modelo Artículo, no en los spects del controlador de
artículos. Los dos juntos comprobarían tanto el funcionamiento de
Articulo como el funcionamiento de ArticulosController.

De todas formas las pruebas y los specs son temas muy difíciles de
discutir, por ejemplo alguién podría decirte que tus mocks te unen
mucho a tu implementación del método, y que si esta cambia tus pruebas
deberían ser modificadas, aunque las postcondiciones del método
siguiesen cumpliendose. Como digo, muy complicado de hacer pruebas que
gusten a todos.

Bueno, muchisimas gracias a los 2, creo que tienes mucha razón Daniel,
eso
deberia especificarlo en la spec del modelo Articulo, bueno ahora me
quedo
un poco mas tranquilo, y vaya que me siento un desarrollador feliz
despues
que empezé a escribir specs ;).

Saludos.

El día 16/02/08, Daniel R. Troitiño [email protected]
escribió: