2012-01-18 4 views
4
class A 
    include Logging 
    log_to 'whatever' 
end 

メソッドlog_toが正しいパラメータで呼び出されるかどうかをテストします。しかし、あなたが推測したように、log_toメソッドはLoggingモジュールから来て、クラスがロードされるときに呼び出されます。 log_to 'whatever'が呼び出されているかどうかを確認するためのスペックまたはカスタムのマッチャーを作成するにはどうすればよいですか?クラスのロード時に呼び出されるクラスメソッドの仕様書を書くにはどうすればよいですか?

class Alog_toメソッドを偽装しても、クラスロード時に呼び出されると呼び出されるかどうかは仕様にはありません。私は定数を削除して、もう一度読み込みましたが、うまくいかないようです。思考?

答えて

3

これはおそらく、クラスAの機能の大部分をテストするspecファイルから別のspecファイルにする必要があります:私はテストへの容易なものにクラスの振る舞いを変更する、しかし、検討する

describe 'A' do 

    it 'should log when loaded' do 
    class A ; end 
    A.should_receive(:log_to).with('whatever') 
    require 'a' 
    end 

end 

。それらの構築において珍しいか、または厄介な制約を有するテストは、コード臭である。

+0

私はあなたに同意しますが、クラスログを別のファイルに作成するのは、このやり方では意味があります。それじゃない?そうでない場合は、別の方法をお勧めしますか? – Chirantan

+0

@Chirantin、それを考えて、あなたは正しい - 実装は立つべきです。私はそれをテストするために別の方法を発明しようとします - 私はこれまでに提案したことにあまり満足していません。 –

1

実装の詳細ではなく、目的の結果をテストする必要があります。私はこのような分離のログインモジュールをテストします:

describe Logging do 
    TEST_IO = StringIO.new 

    # some stub class for testing 
    class Person 
    include Logging 
    log_to TEST_IO 

    def name 
     "Bob" 
    end 
    end 

    after do 
    TEST_IO.reopen 
    end 

    it "logs a method call to the given io" do 
    person = Person.new 
    TEST_IO.string.should eq("") 
    person.name 
    TEST_IO.string.should eq("name called\n") 
    end 

    # ... 
end 

そして私は、私はそれが非常に簡単で、どんな危険なロジックが含まれないため、まったくこのモジュールを使用して実際のクラスをテストするだろうかわかりません。構文上の誤りのような誤った誤りは、統合テストによって捕捉されます。

関連する問題