これは実際には言語に依存しません。ただし、Python でのコンテキストを説明します。
親のクラスがあります
class Mammal(object):
def __init__(self):
""" do some work """
def eat(self, food):
"""Eat the food"""
way_to_eat = self._eating_method()
self._consume(food)
def _eating_method(self):
"""Template method"""
def _consume(self, food):
"""Template method"""
ここではeat
が唯一のパブリック メソッドですが、_consume
と は_eating_method
実際には子クラスによって実装される保護されたメソッドです。
クラスだけを記述した場合、何をテストしますかMammal
?
明らかに4つの方法すべてです。
さて、子供を紹介しましょう
class Tiger(Mammal):
def _eating_method(self):
"""Template method"""
def _consume(self, food):
"""Template method"""
このクラスを見てください。2つしかありません保護された方法。
4 つのメソッドすべてTiger
(継承された 2 つを含む) をテストする必要がありますか、それとも導入された変更 (オーバーライドされた 2 つのメソッドのみ) のみをテストする必要がありますか?
理想的なケースとはどのようなものでしょうか?
ベストアンサー1
理論的な観点から、インスタンス化可能なクラスのパブリックメソッドのみをテストする必要があります(標準のOOP言語)。内部動作をテストしても意味がありません。必要なのは「その入力に対する出力」(特定のメソッド、またはクラス全体)だけだからです。可能な限りそれを尊重するようにしてください。なぜなら、それはあなたにいくつかの質問を強いるからです。カプセル化クラスと提供されたインターフェースは、アーキテクチャにとって決定的な要素となる可能性があります。
実用的な観点から、実装された具体的なサブクラスを持たない抽象ヘルパークラスや、その子クラスの90%以上を抽象クラスで構成し、保護されたメソッドに接続せずに出力をテストするのが難しい場合があります。そのような場合は、モックサブクラス。
簡単な例では、クラスのみTiger
(およびパブリック メソッドのみeat
)をテストすることをお勧めします。
考えている人へのメモタイムスタンプTDD では、 はリファクタリング フェーズの結果であるため、
Mammal
の前にクラスのコーディングを開始すべきではありません。したがって、 に対する特定のテストは絶対に必要ありません。Tiger
Mammal
Mammal