Este documento presenta una introducción a los mocks y stubs, objetos simulados que se usan para probar componentes de forma aislada. Explica que los mocks definen el comportamiento esperado y permiten verificar que los métodos se llaman correctamente, mientras que los stubs solo devuelven valores predefinidos. También menciona algunos frameworks populares para crear mocks y stubs en diferentes lenguajes de programación como Java, Ruby y .NET.
How to use Redis with MuleSoft. A quick start presentation.
Curso TDD Ruby on Rails #06: Mocks y stubs
1. CURSO DE TESTING OSL
12 – 16 DE ABRIL 2010
Mocks y stubs
Alberto Perdomo
Web: http://albertoperdomo.net
Email: alberto.perdomo@aentos.es
Twitter: @albertoperdomo http://www.aentos.com
2. EL PROBLEMA
→ Debemos probar el comportamiento de los componentes de
forma aislada
→ A veces los componentes dependen de objetos externos
→ Otras clases
→ Librerías externas
→ APIs, servicios web (Google Maps, Geonames, Gravatar, …)
→ Colas de mensajes (AMQP, …)
→ Llamadas a servicios externos (HTTP, FTP, XMPP, …)
→ Time
3. LA SOLUCIÓN: MOCK OBJECTS
→ MOCKS OBJECTS = Objetos simulados que imitan el
comportamiento de objetos reales de forma controlada
→ implementan el mismo interfaz que los objetos reales
→ los objetos cliente no saben si están usando un objeto real o uno “de
mentira”
→ Se puede especifcar que métodos esperamos sean
llamados, con qué parámetros y qué valores debe devolver
→ Podemos probar que el objeto que estamos testeando
utiliza de forma correcta el mock
4. UNA VARIANTE: STUBS
→ Más simples que los mocks
→ Objetos “de mentira” que devuelven valores predefnidos
→ No podemos defnir qué métodos esperamos sean llamados
→ Cuando no nos interesa si se utiliza bien o no el objeto “de
mentira”
5. MOCKS Y STUBS: EQUILIBRIO
→ No se deben sobreutilizar
→ pueden complicar el mantenimiento de nuestras pruebas
→ Debemos usarlos sobre todo para todos los componentes
externos que usemos en nuestro código
→ para acelerar las pruebas (algunos servicios web, etc. tardan en
responder varios segundos)
→ cuando el componente externo no está disponible para las pruebas
(p.ej. un servicio web sólo disponible en producción)
→ cuando el componente externo puede fallar (si un servicio web no
está disponible no podremos saber si nuestro código funciona bien)
6. MOCKS Y STUBS
→ Frameworks para muchos lenguajes y plataformas
→ Java, .NET, C++, Ruby, …
→ En Ruby / Ruby on Rails
→ mocha
→ fexmock
→ rr
→ Rspec (librería de testing) lo incorpora
→ Factory girl incorpora stubs
7. MOCK: EJEMPLO
test unitario instanciamos el objeto mock
def test_should_start_engine
engine = mock('engine')
pasamos el mock al objeto que
car = Car.new(engine) estamos probando
engine.expects(:start)
creamos las expectativas en el
car.start
objeto mock
end
hacemos las llamadas al objeto,
si no se llama a los métodos
esperados (expectativas) se
lanzará un erro
http://yarorb.wordpress.com/2007/11/26/mocks-and-stubs-in-ruby-on-rails-the-mocha-solution/
8. STUB: EJEMPLO
test unitario instanciamos el objeto stub
def test_should_return_false_for_failed_print
document = stub("my document")
creamos las expectativas en el
document.stubs(:print).returns(false)
objeto mock
ui = View.new(document)
assert_equal false, ui.print pasamos el mock al objeto que
estamos probando
end
Probamos el comportamiento
esperado en el objeto que
queremos testear
http://yarorb.wordpress.com/2007/11/26/mocks-and-stubs-in-ruby-on-rails-the-mocha-solution/
9. INYECTAR COMPORTAMIENTO
EN OBJETOS REALES
→ Algunos frameworks nos permiten inyectar un
comportamiento predefnido o expectativas en objetos reales
Inyectar comportamiento y expectativas en un objeto real
MyModel.should_receive(:find).with(id).and_return(@mock_model_instance)