まず、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
おかげで、それは超便利です。 Test :: Unit(とshoulda)を使って正しい方法を知っていますか? – mike
私が知る限り、Test :: Unitには同様の機能がありません。もちろん、この例では 'PhoneableTests'のようなモジュールを作成し、それを含めて再利用することができます。 –
私はこれを正解とマークし、それからshouldaについて別の質問をするかもしれません。あるいは、私はRSpecバンドワゴンに飛び乗るべきです。 – mike