Найденный вами метод, безусловно, сработает для проверки некоторой функциональности, но кажется довольно хрупким - ваш фиктивный класс (на самом деле только 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, просто не подойдет.