Rspec + Rails: Probando modelos

Rspec + Rails: Probando modelos

enmanuelm19@gmail.com2018-07-31 11:55:57 UTC

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.


Compartir