Знайдений вами метод, безумовно, допоможе перевірити функціональність, але здається досить крихким - ваш фіктивний клас (насправді просто Struct
у вашому рішенні) може чи не може поводитись як справжній клас, який include
викликає ваше занепокоєння. Крім того, якщо ви намагаєтеся перевірити проблеми з моделлю, ви не зможете робити такі речі, як перевірити дійсність об'єктів або викликати зворотні виклики ActiveRecord, якщо ви не встановите відповідну базу даних (тому що ваш клас манекена не буде підтримувати таблицю бази даних це). Крім того, ви хочете не тільки перевірити проблему, але і перевірити поведінку концерну у своїх специфікаціях.
То чому б не вбити двох птахів одним каменем? Використовуючи загальнодоступні групи прикладів RSpec , ви можете перевірити свої занепокоєння щодо фактичних класів, які їх використовують (наприклад, моделі), і ви зможете протестувати їх скрізь, де вони використовуються. І вам потрібно лише один раз написати тести, а потім просто включити їх у будь-яку специфікацію моделі, яка використовує вашу турботу. У вашому випадку це може виглядати приблизно так:
# 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
Переваги цього підходу стають ще більш очевидними, коли ви починаєте робити такі проблеми, як викликати зворотній зв'язок AR, де нічого менше, ніж об'єкт AR, просто не буде робити.