0

作成中の単体テスト用のテストデータを簡単に作成できるように、ビルダーの構築を開始しました。

ビルダーの基本構造は次のとおりです。

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

このパターンの使用法は次のようになります。

MyClass mc = new MyClassBuilder().WithId(5).Build();

私はそれで満足しています...しかし、質問があるMyClassのは、自明ではないプロパティがある場合です....デフォルト値でそれを構築する方法について少し確信が持てません。

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //do I construct the default value using a MySecondClassBuilder?
    public MySecondClass mySecondClass;

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClassBuilder WithMySecondClass(MySecondClass mySecondClass)
    {
        this.mySecondClass = mySecondClass;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

私の仮定は、ビルダーを作成し、MySecondClassそれを使用してデフォルトの実装を作成することです。

私の仮定が正しく、ベストプラクティスであることを誰かが確認できますか?

私は現在、自分の仮定をテストしている最中ですが、Google を使用して見つけることができるビルダー パターンの唯一の例は、参照型ではなく値型であるプロパティのみを構築したため、StackOverflow でこのアイデアを文書化すると思いました。

4

2 に答える 2

1

ほとんどのものと同様に、状況によります。

mySecondClass フィールドに参照セマンティクスが必要な場合 (つまり、別のクラスへの参照を保存したい場合)、それは整数とまったく同じです。デフォルトを null にすることは、まったく問題ありません。

ただし、常に値を保証したい場合は、2 番目のクラスの新しいオブジェクトを構築するか、単に構築する必要があります。

また、参照コピーではなくクローンを作成する場合は、新しいオブジェクトを作成して参照に割り当てる必要があります。

そうは言っても、多くの場合、流暢なビルド スタイルのインターフェイスを実行しようとするよりも、従来のコンストラクターの方が適切です。従来のコンストラクターよりもユーザーに依存しているため、このような構築のための流暢なインターフェイスを「台無しにする」のは非常に簡単です。

たとえば、あなたのコードで、ユーザーが Build を呼び出さない場合はどうなるでしょうか? (各メソッドがオブジェクトを返すため) まだ何かを返していますが、それは有効ですか? 私はあなたのクラスの消費者として確信が持てません。一方、オーバーロードを使用する従来のコンストラクターは、有効なものと無効なものを正確に示し、コンパイル時に適用されます。

于 2009-09-10T01:46:06.920 に答える
0

単体テストでダミーを使用する複雑なオブジェクトができたら、通常はモック/偽造/分離フレームワークを使用します。C# では、私の好みは Moq ですが、Rhino Mocks や Typemock など、いくつかあります。

利点は、通常、元の型に存在するすべてのプロパティをデフォルト値と空のオブジェクトでスタブ化する機能を備えていることです。偽のオブジェクトを作成するための 1 行のステートメント以外は何もする必要はありません。同時に、テストに重要なプロパティの値に必要な値を返すようにオブジェクトを簡単に構成できます。また、そのようなフレームワークのほとんどは再帰的な偽造をサポートしているため、型内の複雑なオブジェクトも偽造されます。

別のフレームワークを使用したくない場合には、Reed Copsey の提案が手動の方法になると思います。

モック フレームワークの追加を避ける理由が何もない場合 (テストを分割したと仮定すると、これはテスト プロジェクトへの依存関係にすぎません)、複雑な型にはそれを心からお勧めします。

于 2010-03-01T13:18:28.363 に答える