SlideShare a Scribd company logo
1 of 11
CURSO DE TESTING OSL
        12 – 16 DE ABRIL 2010




                  Factorías de objetos


Alberto Perdomo

Web:       http://albertoperdomo.net
Email:     alberto.perdomo@aentos.es
Twitter:   @albertoperdomo             http://www.aentos.com
PROBLEMAS DE LOS FIXTURES:
     DATOS ESPECÍFICOS

→ A veces hacen falta datos específcos para ciertas pruebas
pero están disponibles para todos los tests.


→ Ejemplo:
   Hemos implementado la gestión de cobros y para probar los
   casos extremos necesitamos una instancia de usuario sin
   saldo sufciente.
PROBLEMAS DE LOS FIXTURES:
      MANTENIBILIDAD

→ incómodos


→ difíciles de mantener


→ a menudo las relaciones acaban “rotas”.
PROBLEMA RESUELTO:
        FACTORÍAS DE OBJETOS

→ compatibles con los fxtures


→ usa lo que más te guste o lo que mejor se adapte a la situación


→ ¡extremadamente fexibles!
VARIAS ALTERNATIVAS
Factory Girl
   → http://github.com/thoughtbot/factory_girl

Machinist
   → http://github.com/notahat/machinist

Object daddy
   → http://github.com/fogic/object_daddy

Fixture Replacement
   → http://github.com/smtlaissezfaire/fxturereplacement



y otras...
FACTORY GIRL: DEFINICIÓN

Se suelen defnir
   → todas dentro del mismo fchero → test/factories.rb
   → o en fcheros separados test/factories/user.rb etc.


  # This will guess the User class
  Factory.define :user do |u|
                                      test/factories.rb
    u.first_name 'John'               spec/factories.rb
    u.last_name 'Doe'                 test/factories/*.rb
    u.admin false
  end
                                      spec/factories/*.rb
FACTORY GIRL: AVANZADO
Lazy attributes
Factory.define :user do |u|
  # ...
  u.activation_code { User.generate_activation_code }
end




Dependent Attributes
Factory.define   :user do |u|
  u.first_name   'Joe'
  u.last_name    'Blow'
  u.email {|a|   "#{a.first_name}.#{a.last_name}@example.com".downcase }
end

Factory(:user, :last_name => 'Doe').email
# => "joe.doe@example.com"
FACTORY GIRL: AVANZADO
Asociaciones
Factory.define :post do |p|
  # ...
  p.author {|author| author.association(:user, :last_name => 'Writely') }
end




Secuencias
# Defines a new sequence                     Ejemplo: uso de sequence para el
Factory.sequence :email do |n|               email dentro de la factoría de usuarios
  "person#{n}@example.com"
end
                                              Factory.define :user do |f|
Factory.next :email                             f.email { Factory.next(:email) }
# => "person1@example.com"                    end

Factory.next :email
# => "person2@example.com"
FACTORY: USO BÁSICO



      user = Factory(:user)
FACTORY GIRL: USO AVANZADO

# Returns a User instance that's not saved
user = Factory.build(:user)

# Returns a saved User instance
user = Factory.create(:user)

# Returns a hash of attributes that can be used to build a User instance:
attrs = Factory.attributes_for(:user)

# Returns an object with all defined attributes stubbed out:
stub = Factory.stub(:user)

# Same as Factory.create :user:
user = Factory(:user)

# Build a User instance and override the first_name property
user = Factory.build(:user, :first_name => 'Joe')
user.first_name
# => "Joe"
¿PREGUNTAS?

More Related Content

What's hot

Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
jaircazarin
 
Estructuras de control en php
Estructuras de control en phpEstructuras de control en php
Estructuras de control en php
cristian guevara
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual C
oswchavez
 

What's hot (20)

Php basico
Php basicoPhp basico
Php basico
 
Documento Margarita
Documento MargaritaDocumento Margarita
Documento Margarita
 
Comandos de Java
Comandos de JavaComandos de Java
Comandos de Java
 
Comandos Java
Comandos JavaComandos Java
Comandos Java
 
Presentación 09 Cajas blanca
Presentación 09 Cajas blancaPresentación 09 Cajas blanca
Presentación 09 Cajas blanca
 
Presentación 13 Paso por referencia
Presentación 13 Paso por referenciaPresentación 13 Paso por referencia
Presentación 13 Paso por referencia
 
For shell script
For    shell scriptFor    shell script
For shell script
 
While Shell Script
While  Shell ScriptWhile  Shell Script
While Shell Script
 
Primeros Programas Shell Script
Primeros Programas Shell ScriptPrimeros Programas Shell Script
Primeros Programas Shell Script
 
Parámetros en shell script
Parámetros en shell scriptParámetros en shell script
Parámetros en shell script
 
Estructuras de control 1
Estructuras de control 1Estructuras de control 1
Estructuras de control 1
 
Ocho cosas que debes saber de JavaScript
Ocho cosas que debes saber de JavaScriptOcho cosas que debes saber de JavaScript
Ocho cosas que debes saber de JavaScript
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
 
Estructuras de control en php
Estructuras de control en phpEstructuras de control en php
Estructuras de control en php
 
Entidades
EntidadesEntidades
Entidades
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas
 
Toi Tdd 20080409
Toi Tdd 20080409Toi Tdd 20080409
Toi Tdd 20080409
 
Semana 1 Estructuras de Datos en Java
Semana 1   Estructuras de Datos en JavaSemana 1   Estructuras de Datos en Java
Semana 1 Estructuras de Datos en Java
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual C
 
Estructuras de control en js
Estructuras de control en jsEstructuras de control en js
Estructuras de control en js
 

Viewers also liked

UA_PPM Certificate
UA_PPM CertificateUA_PPM Certificate
UA_PPM Certificate
Carla Reece
 
La construccion en la mineria
La construccion en la mineriaLa construccion en la mineria
La construccion en la mineria
Nicole Ormazabal
 
Augsburg College Leadership Certificate - Jim Lucht
Augsburg College Leadership Certificate - Jim LuchtAugsburg College Leadership Certificate - Jim Lucht
Augsburg College Leadership Certificate - Jim Lucht
Jim Lucht
 
Presentazione standard di PowerPoint
Presentazione standard di PowerPointPresentazione standard di PowerPoint
Presentazione standard di PowerPoint
VisualBee.com
 

Viewers also liked (15)

oi
oioi
oi
 
Shenjtëri dhe disiplinë (Kisha sipas Dhiatës së Re)
Shenjtëri dhe disiplinë (Kisha sipas Dhiatës së Re)Shenjtëri dhe disiplinë (Kisha sipas Dhiatës së Re)
Shenjtëri dhe disiplinë (Kisha sipas Dhiatës së Re)
 
Overview Shop2market
Overview Shop2marketOverview Shop2market
Overview Shop2market
 
UA_PPM Certificate
UA_PPM CertificateUA_PPM Certificate
UA_PPM Certificate
 
La construccion en la mineria
La construccion en la mineriaLa construccion en la mineria
La construccion en la mineria
 
2014 competition entry_presentation_petopia
2014 competition entry_presentation_petopia2014 competition entry_presentation_petopia
2014 competition entry_presentation_petopia
 
HR-Mate Apr2015
HR-Mate Apr2015HR-Mate Apr2015
HR-Mate Apr2015
 
Augsburg College Leadership Certificate - Jim Lucht
Augsburg College Leadership Certificate - Jim LuchtAugsburg College Leadership Certificate - Jim Lucht
Augsburg College Leadership Certificate - Jim Lucht
 
Anbefaling
AnbefalingAnbefaling
Anbefaling
 
20141106125620
2014110612562020141106125620
20141106125620
 
Presentazione standard di PowerPoint
Presentazione standard di PowerPointPresentazione standard di PowerPoint
Presentazione standard di PowerPoint
 
Stairlift Market In depth Industry Research and Competitive Landscape 2015
Stairlift Market In depth Industry Research and Competitive Landscape 2015Stairlift Market In depth Industry Research and Competitive Landscape 2015
Stairlift Market In depth Industry Research and Competitive Landscape 2015
 
Heineken Positioning
Heineken PositioningHeineken Positioning
Heineken Positioning
 
Market Research India - Coaching Classes Market in India 2009
Market Research India - Coaching Classes Market in India 2009Market Research India - Coaching Classes Market in India 2009
Market Research India - Coaching Classes Market in India 2009
 
Pg Lean Maintenance
Pg Lean MaintenancePg Lean Maintenance
Pg Lean Maintenance
 

Similar to Curso TDD Ruby on Rails #04: Factorías de objetos

Inyecciones sql para todos
Inyecciones sql para todosInyecciones sql para todos
Inyecciones sql para todos
csaralg
 
Manual sgbdoo db4 o en c#
Manual sgbdoo db4 o en c#Manual sgbdoo db4 o en c#
Manual sgbdoo db4 o en c#
Irene Lorza
 
Manual script usuarios masivos
Manual script usuarios masivosManual script usuarios masivos
Manual script usuarios masivos
Yimy Pérez Medina
 
Construccion a través de compontes
Construccion a través de compontesConstruccion a través de compontes
Construccion a través de compontes
jalzate
 
Algoritmos - Funciones C++
Algoritmos - Funciones C++ Algoritmos - Funciones C++
Algoritmos - Funciones C++
Ronal Palomino
 
Configuración Script Usuarios Masivos Windows Server 2012 R2
Configuración Script Usuarios Masivos Windows Server 2012 R2Configuración Script Usuarios Masivos Windows Server 2012 R2
Configuración Script Usuarios Masivos Windows Server 2012 R2
cyberleon95
 
Constructores en Java
Constructores en JavaConstructores en Java
Constructores en Java
Alelt2890
 

Similar to Curso TDD Ruby on Rails #04: Factorías de objetos (20)

Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytest
 
Seguridad en access
Seguridad en accessSeguridad en access
Seguridad en access
 
Fabric más allá de lo básico
Fabric más allá de lo básicoFabric más allá de lo básico
Fabric más allá de lo básico
 
Inyecciones sql para todos
Inyecciones sql para todosInyecciones sql para todos
Inyecciones sql para todos
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
Manual sgbdoo db4 o en c#
Manual sgbdoo db4 o en c#Manual sgbdoo db4 o en c#
Manual sgbdoo db4 o en c#
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDD
 
Introducción a DJango
Introducción a DJangoIntroducción a DJango
Introducción a DJango
 
Operadores poo
Operadores pooOperadores poo
Operadores poo
 
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
 
Javascript OOP
Javascript OOPJavascript OOP
Javascript OOP
 
Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 
Clase 21 programacion ejb 3.0
Clase 21 programacion ejb 3.0Clase 21 programacion ejb 3.0
Clase 21 programacion ejb 3.0
 
Modelo Persistente
Modelo PersistenteModelo Persistente
Modelo Persistente
 
Test unitarios
Test unitariosTest unitarios
Test unitarios
 
Manual script usuarios masivos
Manual script usuarios masivosManual script usuarios masivos
Manual script usuarios masivos
 
Construccion a través de compontes
Construccion a través de compontesConstruccion a través de compontes
Construccion a través de compontes
 
Algoritmos - Funciones C++
Algoritmos - Funciones C++ Algoritmos - Funciones C++
Algoritmos - Funciones C++
 
Configuración Script Usuarios Masivos Windows Server 2012 R2
Configuración Script Usuarios Masivos Windows Server 2012 R2Configuración Script Usuarios Masivos Windows Server 2012 R2
Configuración Script Usuarios Masivos Windows Server 2012 R2
 
Constructores en Java
Constructores en JavaConstructores en Java
Constructores en Java
 

More from 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
 

More from Alberto Perdomo (10)

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 #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
 
Curso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsCurso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubs
 
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
 
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/...
 

Recently uploaded

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Recently uploaded (12)

Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
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
 
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
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
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
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
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.
 
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...
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
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
 
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
 
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
 

Curso TDD Ruby on Rails #04: Factorías de objetos

  • 1. CURSO DE TESTING OSL 12 – 16 DE ABRIL 2010 Factorías de objetos Alberto Perdomo Web: http://albertoperdomo.net Email: alberto.perdomo@aentos.es Twitter: @albertoperdomo http://www.aentos.com
  • 2. PROBLEMAS DE LOS FIXTURES: DATOS ESPECÍFICOS → A veces hacen falta datos específcos para ciertas pruebas pero están disponibles para todos los tests. → Ejemplo: Hemos implementado la gestión de cobros y para probar los casos extremos necesitamos una instancia de usuario sin saldo sufciente.
  • 3. PROBLEMAS DE LOS FIXTURES: MANTENIBILIDAD → incómodos → difíciles de mantener → a menudo las relaciones acaban “rotas”.
  • 4. PROBLEMA RESUELTO: FACTORÍAS DE OBJETOS → compatibles con los fxtures → usa lo que más te guste o lo que mejor se adapte a la situación → ¡extremadamente fexibles!
  • 5. VARIAS ALTERNATIVAS Factory Girl → http://github.com/thoughtbot/factory_girl Machinist → http://github.com/notahat/machinist Object daddy → http://github.com/fogic/object_daddy Fixture Replacement → http://github.com/smtlaissezfaire/fxturereplacement y otras...
  • 6. FACTORY GIRL: DEFINICIÓN Se suelen defnir → todas dentro del mismo fchero → test/factories.rb → o en fcheros separados test/factories/user.rb etc. # This will guess the User class Factory.define :user do |u| test/factories.rb u.first_name 'John' spec/factories.rb u.last_name 'Doe' test/factories/*.rb u.admin false end spec/factories/*.rb
  • 7. FACTORY GIRL: AVANZADO Lazy attributes Factory.define :user do |u| # ... u.activation_code { User.generate_activation_code } end Dependent Attributes Factory.define :user do |u| u.first_name 'Joe' u.last_name 'Blow' u.email {|a| "#{a.first_name}.#{a.last_name}@example.com".downcase } end Factory(:user, :last_name => 'Doe').email # => "joe.doe@example.com"
  • 8. FACTORY GIRL: AVANZADO Asociaciones Factory.define :post do |p| # ... p.author {|author| author.association(:user, :last_name => 'Writely') } end Secuencias # Defines a new sequence Ejemplo: uso de sequence para el Factory.sequence :email do |n| email dentro de la factoría de usuarios "person#{n}@example.com" end Factory.define :user do |f| Factory.next :email f.email { Factory.next(:email) } # => "person1@example.com" end Factory.next :email # => "person2@example.com"
  • 9. FACTORY: USO BÁSICO user = Factory(:user)
  • 10. FACTORY GIRL: USO AVANZADO # Returns a User instance that's not saved user = Factory.build(:user) # Returns a saved User instance user = Factory.create(:user) # Returns a hash of attributes that can be used to build a User instance: attrs = Factory.attributes_for(:user) # Returns an object with all defined attributes stubbed out: stub = Factory.stub(:user) # Same as Factory.create :user: user = Factory(:user) # Build a User instance and override the first_name property user = Factory.build(:user, :first_name => 'Joe') user.first_name # => "Joe"