私は、テストに適したコードを書くためのベスト プラクティスを見つけようとしていますが、より具体的には、オブジェクトの構築に関連するプラクティスを見つけようとしています。ブルーブックでは、エンティティや値オブジェクトなどの破損を回避するために、オブジェクトを作成するときに不変条件を適用する必要があることを発見しました。これに従うと、次のようなコードを書くことになります。
class Car
{
//Constructor
public Car(Door door, Engine engine, Wheel wheel)
{
Contract.Requires(door).IsNotNull("Door is required");
Contract.Requires(engine).IsNotNull("Engine is required");
Contract.Requires(wheel).IsNotNull("Wheel is required");
....
}
...
public void StartEngine()
{
this.engine.Start();
}
}
まあ、これは一見良さそうですよね?オブジェクトが作成されるたびにCar
、オブジェクトが「有効」であることを確認できるように、必要なコントラクトを公開する安全なクラスを構築しているようです。
では、テスト主導の観点からこの例を見てみましょう。
テストに適したコードを作成したいのですが、オブジェクトを分離してテストできるようにするには、Car
オブジェクトを作成するためだけに、依存関係ごとにスタブまたはダミー オブジェクトのモックを作成する必要があります。メソッドのように、これらの依存関係の 1 つだけを使用するStartEngine
メソッド。Misko Hevery のテスト哲学に従って、コンストラクターに null 参照を渡すだけの Door または Wheel オブジェクトを気にしないことを明示的に指定するテストを書きたいと思いますが、null をチェックしているので、それを行うことはできません。
これはほんの小さなコードですが、実際のアプリケーションに直面すると、サブジェクトの依存関係を解決する必要があるため、テストを書くのはますます難しくなります。
Misko は、コード内で null チェックを悪用するべきではないと提案しています (これは Design By Contract に反します)。それを行うと、テストを書くのが苦痛になります。別の方法として、彼は次のように述べています。私たちのコードは、どこにでもヌルチェックがあるという理由だけで安全です。」
これについてどう思いますか?どのようにしますか?ベストプラクティスは何ですか?