SlideShare una empresa de Scribd logo
1 de 10
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
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
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
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”
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)
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
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/
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/
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)
¿PREGUNTAS?

Más contenido relacionado

Destacado

Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2
estialvarez
 
Multiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de cssMultiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de css
Leonidas Esteban González
 

Destacado (20)

Sass: CSS con Superpoderes
Sass: CSS con SuperpoderesSass: CSS con Superpoderes
Sass: CSS con Superpoderes
 
Conviértete en un desarrollador web front-end
Conviértete en un desarrollador web front-endConviértete en un desarrollador web front-end
Conviértete en un desarrollador web front-end
 
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
 
CSS Preprocessors - Sass
CSS Preprocessors - SassCSS Preprocessors - Sass
CSS Preprocessors - Sass
 
Ruby intro
Ruby introRuby intro
Ruby intro
 
Uso de las Infraestructuras de Datos Espaciales en Astronomía
Uso de las Infraestructuras de Datos Espaciales en AstronomíaUso de las Infraestructuras de Datos Espaciales en Astronomía
Uso de las Infraestructuras de Datos Espaciales en Astronomía
 
Pre-procesadores CSS. SASS
Pre-procesadores CSS. SASSPre-procesadores CSS. SASS
Pre-procesadores CSS. SASS
 
Lenguaje de programación Ruby
Lenguaje de programación RubyLenguaje de programación Ruby
Lenguaje de programación Ruby
 
Sass y compass
Sass y compassSass y compass
Sass y compass
 
Curso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticasCurso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticas
 
Taller ruby
Taller rubyTaller ruby
Taller ruby
 
Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on Rails
 
2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Ruby Facil
Ruby FacilRuby Facil
Ruby Facil
 
Haml y Sass: HTML y CSS dietéticos
Haml y Sass: HTML y CSS dietéticosHaml y Sass: HTML y CSS dietéticos
Haml y Sass: HTML y CSS dietéticos
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on Rails
 
Multiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de cssMultiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de css
 
Curso TDD Ruby on Rails #01: Introducción al testing
Curso TDD Ruby on Rails #01: Introducción al testingCurso TDD Ruby on Rails #01: Introducción al testing
Curso TDD Ruby on Rails #01: Introducción al testing
 
Front-end Basics for Developers
Front-end Basics for DevelopersFront-end Basics for Developers
Front-end Basics for Developers
 

Similar a Curso TDD Ruby on Rails #06: Mocks y stubs

Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
ssuser2e6b96
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
Jordi Gerona
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
Jordi Gerona
 
OOP.JAVAS pjs
OOP.JAVAS pjsOOP.JAVAS pjs
OOP.JAVAS pjs
Jona Val
 
Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3
xjordi
 

Similar a Curso TDD Ruby on Rails #06: Mocks y stubs (20)

Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
 
Test unitarios
Test unitariosTest unitarios
Test unitarios
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytest
 
Bienvenido a la republica independiente de las pruebas unitarias con Core Data
Bienvenido a la republica independiente de las pruebas unitarias con Core DataBienvenido a la republica independiente de las pruebas unitarias con Core Data
Bienvenido a la republica independiente de las pruebas unitarias con Core Data
 
OOP.JAVAS pjs
OOP.JAVAS pjsOOP.JAVAS pjs
OOP.JAVAS pjs
 
Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3
 
Componentes del E-studio
Componentes del E-studioComponentes del E-studio
Componentes del E-studio
 
Mockito
MockitoMockito
Mockito
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Web Workers
Web WorkersWeb Workers
Web Workers
 
Codigo
CodigoCodigo
Codigo
 
Unidad 5: Excepciones Ejercicio 4
Unidad 5: Excepciones Ejercicio 4Unidad 5: Excepciones Ejercicio 4
Unidad 5: Excepciones Ejercicio 4
 
Lab herencia
Lab herenciaLab herencia
Lab herencia
 
Clase numero 6
Clase numero 6Clase numero 6
Clase numero 6
 
Práctica nominas
Práctica nominasPráctica nominas
Práctica nominas
 
Introducción poo
Introducción pooIntroducción poo
Introducción poo
 

Más de Alberto Perdomo

Primeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4jPrimeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4j
Alberto Perdomo
 
Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...
Alberto Perdomo
 

Más de Alberto Perdomo (12)

Primeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4jPrimeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4j
 
Leveraging relations at scale with Neo4j
Leveraging relations at scale with Neo4jLeveraging relations at scale with Neo4j
Leveraging relations at scale with Neo4j
 
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
 
Rails for Mobile Devices @ Conferencia Rails 2011
Rails for Mobile Devices @ Conferencia Rails 2011Rails for Mobile Devices @ Conferencia Rails 2011
Rails for Mobile Devices @ Conferencia Rails 2011
 
Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...
 
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
 
Curso TDD Ruby on Rails #02: Test Driven Development
Curso TDD  Ruby on Rails #02: Test Driven DevelopmentCurso TDD  Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven Development
 
Curso TDD Ruby on Rails #05: Shoulda
Curso TDD Ruby on Rails #05: ShouldaCurso TDD Ruby on Rails #05: Shoulda
Curso TDD Ruby on Rails #05: Shoulda
 
Curso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetosCurso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetos
 
Curso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitariosCurso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitarios
 
Curso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven DevelopmentCurso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven Development
 
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
 

Último

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 

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)