0

モック所有者を渡してオブジェクトをテストしようとしています。元々は所有者としてPartDa が渡されます:PartB1

PartD partD = new PartD(partB1);

PartD今、モックを渡して機能をテストしたいと思いますowner:

PartD partD = new PartD(mockPartB1);

PartDこれは、所有者の所有者のいくつかのステータスを知っていることに依存するものがあることを除いて、問題なく動作します。

Boolean PartD.Validate()
{
    //Some fields are not required if the PartA has more than one transaction
    Boolean is24Hour = (this.PartB1.PartA.Transactions.Count > 1);

    if (this.Firstname == "")
    {
       if (!is24Hour)
           LogError("First name is empty");
       else
          LogWarning("First name is empty, but requires reasonable efforts");
    }

    ...
}

これにより、モックオブジェクトの問題PartDが発生PartB1する.PartATransactionsCount

で 1 つのメソッドの一部をテストすることにのみ関心があるPartDため、ソフトウェア全体を再設計することにはあまり関心がなく、確実に回帰が導入されるため、2 分間の修正をテストできます。私は修正に2分を費やし、テスト方法を見つけようとして6時間を失いました:

PartD partd = new PartD(mock);
partD.HomeAddress = "123 Maïn Street";

CheckEquals(partD.HomeAddress, "123 Main Street");

全体を再設計したいと思っていたとしても。をすべての子オブジェクトに渡すのは、TransactionCount変更されるたびに恐ろしい設計のように思えます。他のValidateトランザクションがあるかどうかを知る必要がある 3 人の子供がダウンしている方法は、子供がその親に関する情報を必要とするシステムの唯一のケースではありません。

親オブジェクトがこのすべての情報をすべての子に伝えた場合、必要がないかどうかにかかわらず、無駄であり、どこかで更新が失われる傾向があります。

また、子 - 子 - 子オブジェクトが新しい内部チェックを持つたびに、その周りのすべてのオブジェクトを再設計する必要があります。これにより、それらはすべて、必要な場合と不要な場合がある情報を渡すことができます。

親が望まない子オブジェクトを与えないようにしながら、必要に応じて子供が親と話すのを避けるにはどうすればよいですか?


編集:私がテストするのを待っている変更は次のとおりです。

if (Pos(homeAddress, "\r\n") > 0) ...

if (Pos("\r\n", homeAddress) > 0) ...
4

1 に答える 1

1

メソッドはおそらく書き直す必要があると思います(または、少なくとも少しリファクタリングする必要があります)。ただし、クラスを制御できる場合、テストを簡単にする簡単な変更は、 を返すpartB1partB1 という名前のプロパティを追加することです。次に、モックはその特定のプロパティに対して true または false を返すことができます。Is24HourPartA.Transactions.Count > 1

明らかに、これは、これらの深いプロパティへのアクセスが少数の場合にのみ役立ちます。

于 2010-10-21T18:52:41.947 に答える