2013-04-24 10 views
24

プライベートメソッドのテストを書くのは良い習慣ですか?私はRSpecを使ってプライベートメソッドをテストすべきですか?

は、次の簡単な例を考えてみましょう:

class Group 
    has_many :members 

    private 

    def release_members 
    members.each { |member| member.update_attributes group_id: nil } 
    end 
end 

RSpecの中release_membersメソッドのテストを書くことをお勧めでしょうか?私はsendを使ってメソッドを呼び出すテストを書く必要があると信じています。 group.send(:release_members)があります。

+1

ルビーの悪党はSandi Metzのポッドキャストを持っているようですが、このトピックについてはhttp://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby-with-sandi- metz /。議論は、あなたが好きな場合はプライベートメソッドをテストすることができ(最終的にはテストを削除することもできますが)、プライベートメソッドを呼び出すパブリックインターフェイスが最も重要です。 –

答えて

17

Sandi Metzの講演では、これらのスライドの中の非常に詳細な説明があります。

https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf

彼女はあなたが好きなら、あなたのプライベートメソッドをテストし、駆動することができることがありますが、心配する必要がある唯一のテストは、パブリックインターフェイスをテストするものであることを述べています。そうしないと、実装にあまりにも強く結びついているかもしれません。

私は、サービスと価値オブジェクトを分割してそれらをテストの下に置くことについては、テストされていない複雑なプライベートメソッドについては神経質になっていると思います。

+0

私にそのリンクを指摘してくれてありがとう。素晴らしい資源のようだ! –

+1

リンクが壊れています。 – Oin

28

プライベートメソッドはクラスの内部メカニズムに属するので、テストしないでください。単体テストの目的は、インターフェイス、つまりパブリックメソッドを介して対話するときにクラスが期待どおりに動作するかどうかをチェックすることです。

長いプライベートメソッドが不便な場合は、そのロジックをクラス外に取り出して別のモジュールやクラスを作成する機会があるからでしょう。その後、ユニットテストを行うことができます。インターフェース、つまりpublicメソッドだけをテストすることもできます。

まれに、内部ロジック全体が非常に複雑で問題を分割したいので、プライベートメソッドをテストする必要があります。しかし、99.9%でプライベートメソッドをテストするのは悪い考えです。

+0

多くの意味があります。オプションではありませんが、自由に調整する機会を与えるためにテストするべきではなく、外部APIを壊す場合にのみ心配してください。 –

関連する問題