2011-07-11 10 views
4

私はこの(しかし、より複雑な)のようなモジュールを持っています。現在、テストのために私は、私はちょうどテストケースユニットは

module AliasableTest 
    def self.included(base) 
    base.class_exec do 
     should have_many(:aliases) 
    end 
    end 
end 

での質問は、私は単独でこのモジュールをテスト行くのですかで含まれ、以下のように別のモジュールを作りますか?または、上記の方法で十分です。おそらくもっと良い方法があるようです。

答えて

8

まず、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 
+0

おかげで、それは超便利です。 Test :: Unit(とshoulda)を使って正しい方法を知っていますか? – mike

+0

私が知る限り、Test :: Unitには同様の機能がありません。もちろん、この例では 'PhoneableTests'のようなモジュールを作成し、それを含めて再利用することができます。 –

+0

私はこれを正解とマークし、それからshouldaについて別の質問をするかもしれません。あるいは、私はRSpecバンドワゴンに飛び乗るべきです。 – mike