Во-первых, self.included
- это не хороший способ описать ваши модули, а class_exec
- это ненужное усложнение. Вместо этого вы должны extend ActiveSupport::Concern
, как в:
module Phoneable
extend ActiveSupport::Concern
included do
has_one :phone_number
validates_uniqueness_of :phone_number
end
end
Вы не упомянули, какую тестовую среду вы используете, но RSpec охватывает именно этот случай. Попробуйте это:
shared_examples_for "a Phoneable" do
it "should have a phone number" do
subject.should respond_to :phone_number
end
end
Предположим, что ваши модели выглядят так:
class Person class Business
include Phoneable include Phoneable
end end
Затем в своих тестах вы можете выполнить:
describe Person do
it_behaves_like "a Phoneable" # reuse Phoneable tests
it "should have a full name" do
subject.full_name.should == "Bob Smith"
end
end
describe Business do
it_behaves_like "a Phoneable" # reuse Phoneable tests
it "should have a ten-digit tax ID" do
subject.tax_id.should == "123-456-7890"
end
end