0


0

モック:子供が親と話すのを避ける方法は?

モック_owner_を渡すことでオブジェクトをテストしようとしています。 元々、 PartD`には_owner_として PartB1`が渡されます。

PartD partD = new PartD(partB1);

ここで、モックの「所有者」を渡すことで、「PartD」の機能をテストします。

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`型のモックを必要とし、 PartA`というプロパティを実装する必要があり、 Transactions`プロパティを実装する必要があるため、これによりモックオブジェクトの問題が発生します。 「カウント」。

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

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

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

_ _ たとえ全体を再設計しても構わないと思っていたとしても;変更するたびに `TransactionCount`をすべての子オブジェクトに渡すのは、恐ろしいデザインのようです。 他のトランザクションがあるかどうかを知る必要がある3人の子の「Validate」メソッドは、親に関する情報を必要とする子のシステムの唯一のケースではありません。

親オブジェクトがすべての子にこの情報をすべて渡した場合、それが必要かどうかは無駄であり、どこかで更新を見逃しがちです。

また、child-child-childオブジェクトに新しい* internal *チェックがあるたびに、その周囲のすべてのオブジェクトを再設計する必要があります。そのため、必要な情報または不要な情報をすべて渡すことができます。 _ _

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

'' '' '

*編集:*私がテストするのを待っている変更は:

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

to

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

1 Answer


1


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

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