¿Alguien capaz de explicar qué es Stuby y qué es Mock?

Pues llevo 4 días liado intentando entender que es un Stub y qué es un
Mock y qué relacion tienen, y la conclusión a la que más o menos llego
es:

Un Mock se puede decir que es la forma que tiene Ruby de crear una clase
que aún no está implementada.

Y un Stub es el método de dicha clase y el resultado que se espera de
él.

¿Estoy en lo cierto?

Una duda más: ¿Qué diferencia tiene mock_model con mock?

Un Saludo a todos ;).

El día 17 de junio de 2008 11:46, Carlos
Belizón[email protected]
escribió:> Pues llevo 4 días liado intentando entender que es un Stub y qué es un

Mock y qué relacion tienen

Disclaimer: te hablo de mocha[1] que es con lo único que he trabajado,
aunque imagino que los conceptos de mock y stub deben ser los mismos
independientemente de qué librería utilices.

Creo que la diferencia fundamental entre ambos es que los mocks
testean tu código: indicas qué llamadas esperan tus objetos
(opcionalmente también con qué parámetros, cuántas llamadas, etc) y
devuelves un valor. Si al terminar tu test algún mock no ha recibido
exactamente las llamadas que indicaste hace saltar un fallo en tu
test. Por el contrario los stubs no testean tu código: si les llamas
te devuelven el valor que indicaste y si no reciben llamadas no hacen
saltar ningún fallo.

Ambos pueden servir como apoyo para simular llamadas costosas (por ej:
servicios externos a tu aplicación) o a zonas del código que te
interesa simular para reducir la complejidad de tu test, pero los
mocks permiten además testear explícitamente cómo interactúa tu código
con su entorno.

Una duda más: ¿Qué diferencia tiene mock_model con mock?

No me suena haber visto mock_model en mocha, ¿es una función de rspec
o de alguna otra librería?

[1] http://mocha.rubyforge.org/

El día 17 de junio de 2008 12:23, Carlos
Belizón[email protected]
escribió:> Sí, es una función de rSpec.

Entonces sólo puedo recomendarte la doc de rspec y que hagas alguna
prueba para comprobar las diferencias, o escribir a la lista de rspec
si nadie más responde por
aquí.

       Club.stub!(:find).and_return([@club]) #crea un método find

que devuelve un vector que en este caso sólo contiene la variable @club

   it "debe buscar todos los clubes" do
       Club.should_receive(:find).with(:all).and_return([@prueba])

#¿Aquí estamos usando el método creado con el stub?

No estoy muy familiarizado con la API de rspec, pero diría que en el
segundo caso se trata de un mock: si el test no realiza la llamada
Club.find(:all) obtendrás un fallo en tu test.

       assigns[:clubs].should == [@club] #no logro entender que es

este hash pero imagino que es el que contiene los campos de la vista

En los tests de rails assigns hace referencia a las variables de
instancia del controlador tras procesar la request (que son las mismas
que comparte con la vista).

Raul M. wrote:

No me suena haber visto mock_model en mocha, �es una funci�n de rspec
o de alguna otra librer�a?

Sí, es una función de rSpec.

Aún así tengo algunas lagunillas por ejemplo cuando creas un scaffold en
rSpec te genera el siguiente código (en comentarios lo que yo entiendo
que hace cada línea) y bueno como podéis observar he traducido el código
autogenerado para aclararme más.

describe “manejando GET/clubs” do #describimos el contexto
before(:each) do #para hacer esto antes de cada “caso de uso”
@club = mock_model(Club) #crea una variable de la clase Club
Club.stub!(:find).and_return([@club]) #crea un método find
que devuelve un vector que en este caso sólo contiene la variable @club
end

    def peticion_get #un método
        get 'index' #hace un get de la acción index
    end
    it "debe ser exitosa" do #caso de uso
        peticion_get #hacemos la petición
        response.should be_success #la petición ha de ser exitosa
    end

    it "debe renderizar la plantilla index" do
        peticion_get #hacemos la peticion
        response.should render_template('index') #debemos de 

renderizar la plantilla index
end

    it "debe buscar todos los clubes" do
        Club.should_receive(:find).with(:all).and_return([@prueba]) 

#¿Aquí estamos usando el método creado con el stub?
peticion_get
end

    it "debe asignar a la vista los clubes encontrados" do
        peticion_get
        assigns[:clubs].should == [@club] #no logro entender que es 

este hash pero imagino que es el que contiene los campos de la vista
¿No?
end
end
end

¿Alguien puede corregirme si estoy equivocado?

2008/6/17 Carlos Belizón [email protected]:

Una duda más: ¿Qué diferencia tiene mock_model con mock?

un mock_model en rspec es un mock con una serie de stubs incluidos:

id - devuelve un valor autogenerado
to_param - devuelve el id como string
new_record? - devuelve false
errors - devuelve 0 errores
is_a? - devuelve true si el parametro coincide con la clase del mock
class - devuelve la clase del modelo con la que creas el mock

Espero que te ayude.