El documento presenta una introducción a Ruby on Rails y al desarrollo guiado por pruebas (TDD) usando RSpec. Explica las características principales de Ruby y Rails, incluyendo el patrón MVC y las migraciones de base de datos. También describe los tipos de pruebas como feature specs, model specs y controller specs, y cómo aplicar TDD siguiendo un enfoque top-down u bottom-up.
4. • Lenguaje de programación
interpretado.
Ruby Rails
sábado, 18 de abril de 15
5. • Lenguaje de programación
interpretado.
• Todo son objetos
Ruby Rails
sábado, 18 de abril de 15
6. • Lenguaje de programación
interpretado.
• Todo son objetos
• Tipado dinámico
Ruby Rails
sábado, 18 de abril de 15
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. • 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. • 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. • 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. • 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. • 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. • 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. • 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
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. 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. 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. 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. 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
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. 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. 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. 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
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
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. 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. 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. •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
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. ¿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. 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
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. 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
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. Tipos de tests
Model specs
Source http://bit.ly/1OqctU8
sábado, 18 de abril de 15
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
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