Probando modelos
Según las convenciones de Rails en los modelos debemos llevar la lógica relacionada con la persistencia de datos, por lo tanto las pruebas más comunes a realizar serían a las validaciones sobre los atributos del modelo, las acciones de presistencia y las consultas.
En este post dividiremos nuestras pruebas enfocados en estos roles de los modelos, primero hay que configurar el proyecto para trabajar con rspec, dale un vistazo a este post.
Siguiendo las convenciones de Rails y Rspec por cada modelo X's debemos crear un archivo de prueba en la carpeta spec/models/modelname_spec.rb, la estructura general esta de la siguiente forma:
require 'rails_helper'
RSpec.describe Post, type: :model do
describe 'Validations' do
...
end
describe 'Relations' do
...
end
describe 'Callbacks' do
...
end
end
Validaciones
Las validaciones básicamente evaluan el estado de los objetos antes de persitirse, en el siguiente código veremos como usar shoulda-matchers para validaciones específicas:
# post.rb
class Post < ApplicationRecord
validates :title, :description, presence: true
validates_numericality_of :size, greater_than: 20
...
end
# post_spec.rb
...
describe 'Validations' do
it { should validate_presence_of :title }
it { should validate_presence_of :description }
it { should validate_numeracility_of(:size).is_greater_than(20) }
end
Relaciones
Las relaciones son las que indican como esta diseñada nuestra base de datos y como se relacionan entre sí los objetos de distinta clase.
#post.rb
class Post < ApplicationRecord
...
has_many :comments
belongs_to :user
has_many :mentions, through: :comments
has_and_belongs_to_many :types
accepts_nested_attributes_for :comments, allow_destroy: true
end
#post_spec.rb
...
describe 'Relations' do
it { should have_many :comments }
it { should belong_to :user }
it { should have_many(:mentions).through(:comments) }
it { should have_and_belong_to_many :types }
it { should accept_nested_attributes_for(:comments).allow_destroy(true) }
end
Métodos personalizados
Usados normalmente para modificar el estado del objeto, probaremos dado ciertos parámetros retorne una respuesta específica.
# post.rb
class Post < ApplicationRecord
before_save :set_type
private
def set_type
type = 'some' unless self.comments.length.zero?
end
end
#post_spec.rb
...
describe 'Callbacks' do
it 'should set type some' do
post = Post.new
comment = Comment.new
post << comment
post.save
post.reload
expect(post.type).to eq 'some'
end
end
Con esto hemos concluido esta sección de pruebas a los modelos, cualquier acotación , corrección o duda puedes comentar abajo.