1

私はPHPテストが初めてで、TDDで簡単なプロジェクトを構築しようとしています。

シンプルなアイデアは、ある種のシンプルなカード/デッキ セットアップを作成することでした。

私はテストを書き始め、すぐに失敗したテストからCardDeckクラスとCardStackクラスをマッシュアップし始めました。どちらも getTop()、getTopStack().. などの同じメソッドをいくつか実装していたので、抽象クラスBaseCardStackであるCardDeckInterfaceを実装することにしました。

リファクタリング後。CardDeck と CardStack は、CardStackInterface を実装する BaseCardStack を拡張します。

CardDeck と CardStack の唯一の違いは、CardStack の構造といくつかの追加機能です。それ以外の場合、BaseCardStack から実装された関数は上書きされません。

これが私の悩みの種です。私のCardDeckTestでは、実装されたメソッドに関連付けられたテストがあり、BaseCardDeckを移動しました。

現在のテストを CardDeckTest に保持し (以前と同じようにパスします)、CardStackTest 用に追加のテスト セットを作成する必要がありますか? メソッドは既にテストされており、まったく違いがない (上書きされていない) ため、これは間違った解決策のように思えます。前述のように、BaseCardStack から実装されたメソッドは上書きされません。

代わりに、抽象クラスのテストを移動/作成する必要があると思います。

基本的に、上書きされることなく実装されることがわかっている抽象クラスの関数をテストしたいと考えています。

しかし、どうすればこれを行うことができますか?私は嘲笑すべきですか?パターンを変更する必要がありますか?

4

1 に答える 1

1

代わりに、抽象クラスのテストを移動/作成する必要があると思います

実際には、そのインターフェースを実装する他のクラスに同じ単体テストのセットを適用したいと思うかもしれません。

ただし、警告の言葉を言う前に、よく考えてください。ここでは、おそらく抽象クラスは必要ありません。2つのクラスで使用されるジョブに適したある種のデータ構造があるように聞こえますが、これらの2つのクラスはそのデータ構造ではありません。

ただし、これら 2 つのクラスの両方を抽象データ構造クラスから拡張することにより、実際には、これら 2 つのクラスをこのデータ構造のみにすることになります。

継承より好きな構成。

抽象クラスをテストする方法に関する最初の質問については、それからテストダブルを作成します。これは、抽象クラス(および抽象クラスのテスト)をモックできる PHPUnit モックで動作し、その間に定義されたメソッドを引き継ぎます。

しかし、私は通常、テスト用のスタブクラスを作成し、それ以外の場合はアプリケーションの残りの部分から独立している (ただし、抽象クラスにバインドされている) 抽象基本クラスから拡張されたクラス定義を含む新しいファイルを作成し、それを使用します。単体テストのサブジェクトとして ( PHPUnit を使用した抽象クラスの Test メソッドと比較してください)。

そうしても、ほとんどの場合、複雑なモックとスタブのセットアップの背後にある抽象基本クラスが不要であるという事実を隠すことはできません。達成するのが非常に難しいアプローチで必要なコードをできるだけ少なく書くだけです。

これがお役に立てば幸いです。お気軽にお問い合わせください。

ああ、実はここに別のヒントがあります。抽象基本クラスに対して 1 度か 2 度行ったことは、基本のテストを含む抽象テスト ケースも作成することです。そこから具体的な実装テストを拡張すると、非常にうまく機能しました。IIRCの関連する質問は次のとおりです。

于 2013-09-29T08:40:24.887 に答える