Издевается: как избежать общения детей с родителями? - PullRequest
0 голосов
/ 21 октября 2010

Я пытаюсь проверить объект, передав ложное владелец . Первоначально PartD передавалось бы 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, и ему нужно реализовать свойство с именем PartA, которое должно реализовать свойство Transactions, которое является список с Count.

Меня интересует только тестирование одной части одного метода в PartD, поэтому я не очень заинтересован в перепроектировании всего программного обеспечения, конечно же, в представлении регрессий, поэтому я могу протестировать свое 2-минутное исправление. я потратил 2 минуты на исправление и потерял 6 часов, пытаясь выяснить, как это проверить:

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

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

Даже если бы я был готов перепроектировать всю вещь; передача TransactionCount каждому дочернему объекту, каждый раз, когда он меняется, кажется ужасным замыслом. Метод Validate, при котором трое детей вынуждены знать, существуют ли другие транзакции, - не единственный случай, когда ребенок нуждается в информации о своих родителях.

Если родительские объекты передали всю эту информацию всем дочерним элементам, независимо от того, нуждались ли они в этом, это пустая трата времени, и они могут пропустить обновление где-либо.

Кроме того, каждый раз, когда объект child-child-child имеет новую внутреннюю проверку , он должен заново проектировать все объекты вокруг него, чтобы все они могли передавать информацию это может или не может быть необходимо.

Как я могу избежать того, чтобы дети разговаривали с родителями по мере необходимости, в то время как родители не должны давать детям предметы, которые им не нужны?


Редактировать: Изменение, которое я жду для проверки:

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

до

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

1 Ответ

1 голос
/ 21 октября 2010

Я думаю, что метод, вероятно, нужно переписать (или хотя бы немного изменить); Однако, если у вас есть контроль над классом partB1, возможно, быстрое изменение, которое упростит тестирование, будет состоять в добавлении в partB1 свойства с именем Is24Hour, которое возвращает PartA.Transactions.Count > 1. Тогда ваш макет может просто вернуть true или false для этого конкретного свойства.

Очевидно, что это помогает, только если у вас есть небольшое количество таких глубоких обращений к свойствам.

...