Curso TDD Ruby on Rails #06: Mocks y stubs

1,921 views

Published on

Lección 06 del curso de TDD en Ruby on Rails:
Mocks y stubs

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,921
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Curso TDD Ruby on Rails #06: Mocks y stubs

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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)
  10. 10. ¿PREGUNTAS?

×