Pregunta Cómo probar una preocupación en los rieles


Dado que tengo un Personable preocupación en mi aplicación Rails 4 que tiene una full_name método, ¿cómo voy a probar esto usando RSpec?

preocupaciones / personable.rb

module Personable
  extend ActiveSupport::Concern

  def full_name
    "#{first_name} #{last_name}"
  end
end

73
2018-05-13 15:01


origen


Respuestas:


El método que encontraste funcionará para probar un poco la funcionalidad, pero parece bastante frágil: tu clase ficticia (en realidad solo una Struct en su solución) puede o no comportarse como una clase real que includes tu preocupación Además, si intenta probar las inquietudes del modelo, no podrá hacer cosas como probar la validez de los objetos o invocar devoluciones de llamada de ActiveRecord a menos que configure la base de datos en consecuencia (porque su clase ficticia no tendrá un respaldo de tabla de base de datos eso). Además, querrás no solo probar la preocupación sino también probar el comportamiento de la preocupación dentro de las especificaciones de tu modelo.

Entonces, ¿por qué no matar dos pájaros de un tiro? Mediante el uso de RSpec grupos de ejemplo compartidos, puedes poner a prueba tus inquietudes frente a las clases reales que las usan (por ejemplo, modelos) y podrás probarlos dondequiera que se utilicen. Y solo tiene que escribir las pruebas una vez y luego simplemente incluirlas en cualquier especificación de modelo que use su preocupación. En tu caso, esto podría verse más o menos así:

# app/models/concerns/personable.rb

module Personable
  extend ActiveSupport::Concern

  def full_name
    "#{first_name} #{last_name}"
  end
end

# spec/concerns/personable_spec.rb

require 'spec_helper'

shared_examples_for "personable" do
  let(:model) { described_class } # the class that includes the concern

  it "has a full name" do
    person = FactoryGirl.create(model.to_s.underscore.to_sym, first_name: "Stewart", last_name: "Home")
    expect(person.full_name).to eq("Stewart Home")
  end
end

# spec/models/master_spec.rb

require 'spec_helper'
require Rails.root.join "spec/concerns/personable_spec.rb"

describe Master do
  it_behaves_like "personable"
end

# spec/models/apprentice_spec.rb

require 'spec_helper'

describe Apprentice do
  it_behaves_like "personable"
end

Las ventajas de este enfoque se vuelven aún más obvias cuando comienza a hacer cosas que le preocupan, como invocar devoluciones de llamada AR, donde cualquier cosa que no sea un objeto AR simplemente no funcionará.


131
2017-11-15 21:29



En respuesta a los comentarios que he recibido, esto es lo que terminé haciendo (Si alguien tiene mejoras, no dude en publicarlas):

spec / concerns / personable_spec.rb

require 'spec_helper'

describe Personable do

  let (:test_class) { Struct.new(:first_name, :last_name) { include Personable } }
  let (:personable) { test_class.new("Stewart", "Home") }

  it "has a full_name" do
    personable.full_name.should == "#{personable.first_name} #{personable.last_name}"
  end

end

41
2018-05-13 15:22



Otro pensamiento es usar el with_model gem para probar cosas como esta. Estaba buscando probar una preocupación yo mismo y había visto el pg_search joya haciendo esto. Parece mucho mejor que probar en modelos individuales, ya que estos pueden cambiar, y es bueno definir las cosas que va a necesitar en su especificación.


4
2017-09-19 22:34