2016-11-07 8 views
0

私はカスタムコレクションオブジェクトを持っているとしましょう。 removeメソッドの単体テスト(依存関係なし)を作成するにはどうすればよいですか?後でそのアイテムを削除できるようにaddメソッドを呼び出さなければならないため、removeメソッドはaddメソッドに依存します。ほとんどの場合、このカスタムコレクションクラスは、追加されたすべてのコレクションアイテムを含む保護されたプロパティを持ちます。したがって、削除するコレクションアイテムがないため、addメソッドを疑似できません。 addメソッドはおそらく、複数のオブジェクトのプロパティを変更した場合、私は、オブジェクトの集合を使用して、コンストラクタにコレクションアイテムの配列を渡すと、このカスタム・コレクション・オブジェクトの最初のコレクションアイテムとしてこれを使用するが、これが問題になる可能性がある可能性があり単体テストの代わりに積分テスト

class Item 
{ 
    private $identifier; 

    public function __construct($identifier) 
    { 
     $this->identifier = $identifier; 
    } 

    public function getIdentifier() { return $this->identifier; } 
    ... 
} 

class customCollection 
{ 
    protected $items = []; 
    public function add($item) { 
     $this->items[$item->getIdentifier()] = $item; 
    } 
    public function remove($item) { 
     unset($this->items[$item->getIdentifier()]); 
    } 
    public function getItems() 
    { 
     return $this->items; 
    } 
} 

。ですから、このタスクをどうやって解決するのでしょうか、それとも単なる統合テストですか?フィードバックありがとう!

+0

単位テストでは、従属代用のモックを集中的に使用することを前提としています。私は、この特定のケースがこの命題に従わないために特別であるとは思わない。行数とテストは安全です(そして、あなたの生産コードも)。 – xmike

答えて

2

Itemが十分に簡単な場合は、合併症を気にせずに統合テストを行ってください。最初にItemをテストし、次にcustomCollectionをテストするテストはほとんど作成しないでください。 Itemテストが正常に実行され、customCollectionテストが失敗した場合、そのバグはコレクション内にある可能性が最も高いです。

Itemが非常に複雑な場合は、コレクションで必要なインターフェイスを実装してから、このインターフェイスを簡単に実装してItemをスタブすることができます。その後、Itemと簡単な実装を別々にテストし、その後は簡単な実装で、その後はItemの実装でもテストします。 (でも努力する価値はないと思う)

単体テストと統合テストのポイントは、バグがどこにあるのかを簡単にローカライズすることです。しかし、構造化された統合テストだけで同じことを達成しても問題ありません。

+0

ご意見ありがとうございます。私の懸念は、コレクションの削除メソッドを指します。 addメソッドを呼び出してitemsプロパティに値を設定する必要があります。このメソッドで何らかのエラーが発生した場合、removeメソッドも正常に動作しますが、addメソッドの実装が間違っているだけでエラーが発生します。 – K4rl1

+0

私は両方の方法を一緒にテストします。いくつかのアイテムを最初に '追加 'し、それらが正しく挿入されているかどうかを確認し、それらを'削除'して再度チェックします。私はこれに何か間違っていると私はここで他のオプションが表示されません表示されません。テストを大きすぎると複雑すぎるようにするのは良い考えではありませんが、そうではありません.2つの補完的なアクションがあります。それらを一緒にテストするのは理にかなっています。 –

関連する問題