Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ruby on Rails & TDD con RSpec

1,046 views

Published on

Introducción a Ruby on Rails y TDD con RSpec. Charla imparti

Published in: Software
  • Be the first to comment

Ruby on Rails & TDD con RSpec

  1. 1. Ruby on Rails + TDD (con Rspec) Javier Cuevas Traity Weekend of Code 18/04/2015 sábado, 18 de abril de 15
  2. 2. About me: Javier Cuevas @javier_dev Ruby on Rails Shop P2P Marketplace for Dog Owners sábado, 18 de abril de 15
  3. 3. Ruby Rails sábado, 18 de abril de 15
  4. 4. • Lenguaje de programación interpretado. Ruby Rails sábado, 18 de abril de 15
  5. 5. • Lenguaje de programación interpretado. • Todo son objetos Ruby Rails sábado, 18 de abril de 15
  6. 6. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico Ruby Rails sábado, 18 de abril de 15
  7. 7. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva Ruby Rails sábado, 18 de abril de 15
  8. 8. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva • RubyGems: gestor de paquetes (gemas) Ruby Rails sábado, 18 de abril de 15
  9. 9. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva • RubyGems: gestor de paquetes (gemas) • “to enjoy programming, and to be happy” Ruby Rails sábado, 18 de abril de 15
  10. 10. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva • RubyGems: gestor de paquetes (gemas) • “to enjoy programming, and to be happy” • Framework MVC para Ruby Ruby Rails sábado, 18 de abril de 15
  11. 11. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva • RubyGems: gestor de paquetes (gemas) • “to enjoy programming, and to be happy” • Framework MVC para Ruby • Incluye ORM (mapeador modelos - tablas) Ruby Rails sábado, 18 de abril de 15
  12. 12. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva • RubyGems: gestor de paquetes (gemas) • “to enjoy programming, and to be happy” • Framework MVC para Ruby • Incluye ORM (mapeador modelos - tablas) • Open Source. Creado en 2004. Ruby Rails sábado, 18 de abril de 15
  13. 13. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva • RubyGems: gestor de paquetes (gemas) • “to enjoy programming, and to be happy” • Framework MVC para Ruby • Incluye ORM (mapeador modelos - tablas) • Open Source. Creado en 2004. • “Convention over configuration” Ruby Rails sábado, 18 de abril de 15
  14. 14. • Lenguaje de programación interpretado. • Todo son objetos • Tipado dinámico • Sintaxis limpia e intuitiva • RubyGems: gestor de paquetes (gemas) • “to enjoy programming, and to be happy” • Framework MVC para Ruby • Incluye ORM (mapeador modelos - tablas) • Open Source. Creado en 2004. • “Convention over configuration” • “Dont RepeatYourself” Ruby Rails sábado, 18 de abril de 15
  15. 15. Algunas cosas raras de Ruby sábado, 18 de abril de 15
  16. 16. No hay corchetes { } ni en ifs ni en métodos def make_positive(number) if number < 0 -number else number end end Return implícito sábado, 18 de abril de 15
  17. 17. if y unless al final de línea puts 'es par' if number.even? puts 'es par' unless number.odd? sábado, 18 de abril de 15
  18. 18. Llamadas a métodos sin paréntesis results = method_name param1, param2 results = method_name(param1, param2) results = method_name(param1, param2).another_method sábado, 18 de abril de 15
  19. 19. Símbolos • :my_symbol • NO son variables. NO son constantes. • Podemos verlos como etiquetas. • Fundamentalmente los usamos como índices en arrays asociativos (Hashes). • A pesar de todo: también son objetos. def silly_method(options) puts "Color: " + options[:color] puts "City: " + options[:city] end silly_method :color => "red", :city => "Madrid" sábado, 18 de abril de 15
  20. 20. Blocks • Un Block es un “trozo de código” • Podemos pasarlos como parámetro a un método some_numbers = [1,2,3,4,5] some_numbers.each { |number| puts number } # es equivalente a ... some_numbers.each do |number| puts number end sábado, 18 de abril de 15
  21. 21. Model View Controller sábado, 18 de abril de 15
  22. 22. Web Server Controller Model View sábado, 18 de abril de 15
  23. 23. Web Server Controller Model View sábado, 18 de abril de 15
  24. 24. Web Server Controller Model View sábado, 18 de abril de 15
  25. 25. Web Server Controller Model View sábado, 18 de abril de 15
  26. 26. Web Server Controller Model View sábado, 18 de abril de 15
  27. 27. Web Server Controller Model View sábado, 18 de abril de 15
  28. 28. Web Server Controller Model View sábado, 18 de abril de 15
  29. 29. Web Server Controller Model View sábado, 18 de abril de 15
  30. 30. Web Server Controller Model View sábado, 18 de abril de 15
  31. 31. Web Server Controller Model View sábado, 18 de abril de 15
  32. 32. Web Server Controller Model View ActiveRecord Routes Helpers MVC en Rails sábado, 18 de abril de 15
  33. 33. Web Server Controller Model View ActiveRecord Routes Helpers MVC en Rails Buena práctica: Mantén los Controladores con el menor número de lineas de código. Mueve toda la lógica de tu aplicación al Modelo. sábado, 18 de abril de 15
  34. 34. Model class Post < ActiveRecord::Base # Relationships has_many :comments # Validations validates :title, :presence => true validates :content, :presence => true # Class methods def self.all_posts_by_diacode # ... end # Instance methods def is_recent? # ... end end No es necesario especificar los atributos del objeto en la clase. Rails buscará directamente en la BBDD sábado, 18 de abril de 15
  35. 35. Controller class PostsController < ApplicationController def index @posts = Post.all respond_to do |format| format.html format.js { render json: @posts } end end # More actions... end sábado, 18 de abril de 15
  36. 36. Controller class PostsController < ApplicationController def index @posts = Post.all respond_to do |format| format.html format.js { render json: @posts } end end # More actions... end Respuesta para peticiones html. Al no especificar nada renderizará automaticamente la vista index.html.erb sábado, 18 de abril de 15
  37. 37. View <html> <head> <title>Awesome Rails App</title> </head> <body> <div id="header"> <%= yield :header %> <div> <div id="content"> <%= yield %> </div> </body> </html> <% content_for :header do %> <h1>Post List</h1> <% end %> <p>This is the content!</p> <ul> <% @posts.each do |post| %> <li><%= @post.title %></li> <% end %> </ul> Layout View Ruby ERB <% Ruby code -- inline with output %> <%= Ruby expression -- replace with result %> <%# comment -- ignored -- useful in testing %> sábado, 18 de abril de 15
  38. 38. Relaciones entre Modelos http://bit.ly/15HtEh sábado, 18 de abril de 15
  39. 39. 1 a 1 sábado, 18 de abril de 15
  40. 40. 1 a 1 con modelo intermedio 1 supplier tiene 1 account 1 supplier tiene 1 account_history a través su account 1 account pertenece a 1 supplier 1 account_history pertenece a 1 supplier sábado, 18 de abril de 15
  41. 41. 1 a N sábado, 18 de abril de 15
  42. 42. N a N 3 tablas en la BBDD, pero solo 2 modelos en Rails! sábado, 18 de abril de 15
  43. 43. N a N con modelo intermedio 3 tablas en la BBDD y 3 modelos sábado, 18 de abril de 15
  44. 44. Migraciones Crear y modificar la BBDD sábado, 18 de abril de 15
  45. 45. Migraciones • En Rails todas las modificaciones de la estructura de la BBDD deben hacerse a traves de migraciones. • Las migraciones son archivos Ruby almacenados en [app]/db/migrate • El nombre de archivo de cada migración lleva un timestamp que indica en que orden se ejecutarán. • Permiten crear tablas, modificar columnas, crear índices, etc. • Facilitan la colaboración entre programadores. sábado, 18 de abril de 15
  46. 46. Migraciones class CreatePost < ActiveRecord::Migration def change create_table :posts do |t| t.string :title t.text :content end end end Por convención el nombre de las tablas es siempre en plural sábado, 18 de abril de 15
  47. 47. Migraciones class CreatePost < ActiveRecord::Migration def change create_table :posts do |t| t.string :title t.text :content end end end Por convención el nombre de las tablas es siempre en plural sábado, 18 de abril de 15
  48. 48. •Crear migración rails generate migration CreatePosts •Ejecutar migración rake db:migrate •Deshacer cambios de la última migración rake db:rollback Migraciones Rake permite ejecutar tareas. Hay algunas ya definidas como db:migrate, pero podemos crear tareas rake propias sábado, 18 de abril de 15
  49. 49. TDD Test Driven Development sábado, 18 de abril de 15
  50. 50. Wait, ¿qué es un “test”? • En el contexto delTDD un test: • Es un script que realiza una serie de acciones para validar que otro script, tiene un resultado esperado en unas condiciones determinadas. • (Normalmente) Es escrito en el mismo lenguaje en el que estamos trabajando. • En el contexto delTDD un test NO ES: • Probar “a mano” tu aplicación. sábado, 18 de abril de 15
  51. 51. ¿Qué es el TDD? • Es una metodología de desarrollo consistente en la repetición del siguiente ciclo: 1. Escribimos un test. El test falla (ya que no hay código para hacerlo pasar). 2. Escribimos el código mínimo para hacer que el test “pase” (su resultado sea positivo). 3. Refactorizamos el código necesario. [Volvemos al paso 1] sábado, 18 de abril de 15
  52. 52. TDD en Rails Para hacerTDD lo normal es apoyarse en una librería de testing. Rails por defecto viene con minitest, pero la mayoría de la comunidad utiliza RSpec. En RSpec a los tests se les llama specs. sábado, 18 de abril de 15
  53. 53. MINI DEMO sábado, 18 de abril de 15
  54. 54. Tipos de tests El vocabulario en torno alTDD a menudo es confuso ya que existen muchas formas de categorizar los tests (o specs). A continuación os cuento como nosotros (y gran parte de la comunidad) clasifica y define sus tests sábado, 18 de abril de 15
  55. 55. Tipos de tests Feature specs • Testean una funcionalidad de nuestra app desde la perspectiva del usuario. • Utilizan un navegador automatizado para simular el comportamiento del usuario. • Son muy útiles porque tocan muchas partes de nuestra app (vistas, controladores, rutas, modelos, etc). • A cambio son los más lentos de ejecutar. • También conocidos como: tests de aceptación o integración sábado, 18 de abril de 15
  56. 56. Tipos de tests Feature specs Source http://bit.ly/1OqctU8 sábado, 18 de abril de 15
  57. 57. Tipos de tests Model specs • Testean nuestros modelos (donde debería estar la lógica de negocio). • Incluyen tanto tests de métodos de instancia (sobre un objecto de nuestra clase), como métodos de clase (por ejemplo consultas a la base de datos). • Son bastante rápidos a la hora de ejecutarlos. • También conocidos como: tests unitarios (unit tests). sábado, 18 de abril de 15
  58. 58. Tipos de tests Model specs Source http://bit.ly/1OqctU8 sábado, 18 de abril de 15
  59. 59. Tipos de tests Controller specs • Testean nuestros controladores • Si los controladores son muy simples, podemos omitirlos (con los feature specs estaríamos cubiertos) • En cambio, si nuestra app es una API que devuelve JSON o XML, son múy útiles. sábado, 18 de abril de 15
  60. 60. Tipos de tests Controller specs Source http://bit.ly/1OqctU8 sábado, 18 de abril de 15
  61. 61. TDD y MVC Controller Model View sábado, 18 de abril de 15
  62. 62. Feature specs TDD y MVC Controller Model View sábado, 18 de abril de 15
  63. 63. Feature specs Model specs TDD y MVC Controller Model View sábado, 18 de abril de 15
  64. 64. Feature specs Model specs Controller specs TDD y MVC Controller Model View sábado, 18 de abril de 15
  65. 65. ¿Por donde empiezo? • Dos maneras de hacerTDD: • Top-down (aka outside-in): • Empezamos por el mayor nivel de abtracción (lo que ve el usuario): • Features -> Controllers -> Models • Bottom-up • Empezamos por el código de bajo nivel • Models -> Controllers -> Features sábado, 18 de abril de 15
  66. 66. ¡Gracias! ¿Preguntas? sábado, 18 de abril de 15

×