El método que encontró ciertamente funcionará para probar un poco de funcionalidad, pero parece bastante frágil: su clase ficticia (en realidad, solo una Struct
en su solución) puede o no comportarse como una clase real que include
es de su interés. Además, si está tratando de probar las preocupaciones 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á no solo probar la preocupación, sino también probar el comportamiento de la preocupación dentro de las especificaciones de su modelo.
Entonces, ¿por qué no matar dos pájaros de un tiro? Al usar los grupos de ejemplo compartidos de RSpec , puede probar sus inquietudes con las clases reales que los usan (por ejemplo, modelos) y podrá probarlos en todos los lugares donde se usan. Y solo tiene que escribir las pruebas una vez y luego incluirlas en cualquier especificación del modelo que utilice su preocupación. En su caso, esto podría verse 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 = FactoryBot.build(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 de AR, donde nada menos que un objeto AR simplemente no funcionará.