2016-04-24 6 views
1

Я просто пытаюсь понять, что такое «правильный путь», чтобы писать тесты в следующем случае:PHPUnit и макет для многих объектов зависят

class Time 
{ 
    public function __construct(Hour $h, Minute $m, Second $s) {} 
} 

class TimeRange 
{ 
    public function __construct(Time $start, Time, $end) 
    { 
     if ($this->startTime > $this->endTime) { 
      throw new \Exception; 
     } 
    } 
} 

Цель состоит в том, чтобы реализовать модульный тест для TimeRange метод конструктора, который поможет убедиться, что исключение бросает в какой-то момент

Как правильно получить объект Mock of the Time в этом случае (без получения ложных спагетти)?

+0

Похоже, ваш класс времени это просто значение объекта, скорее всего, это неизменное. Не издевайтесь над объектами ценности, просто создавайте их. –

+0

@JakubZalas Да, вы правы, и это то, что я делал ранее, но теперь я столкнулся с проблемой. Если логика объекта значения будет изменена, тогда весь ваш тест будет разрушен. По мнению, это очень сложно поддерживать такой код. С помощью объектов Mock/Stub это может быть проще – user1016265

+0

Объекты Value не имеют сложной логики. Это ценности. –

ответ

0

Мошенничество может стать довольно сложным. В производственном коде сложные задачи обрабатываются специализированными классами или модулями. В этом случае это одно и то же. Вы можете и должны абстрагировать окурки и издеваться над созданием в классах. Эти классы должны быть частью набора тестов.

В вашем случае, например. вы могли бы иметь класс, который будет возвращать объект Time инициализированную определенный час, минута, секунда:

Вот ссылка на XUnit Design Patterns книги на соответствующем разделе. Есть много моделей только для создания издевается:

http://xunitpatterns.com/Fixture%20Setup%20Patterns.html

+0

спасибо за ссылку, что вы думаете, используя mocks vs real objects, например, предложенный Якубом Заласом? – user1016265

+0

Согласен. По возможности используйте реальные объекты. Если нет необходимости, не делайте вещи более сложными. Но когда нужно использовать макеты или заглушки, создание макета не является тривиальным, полезно иметь некоторый вспомогательный класс, создающий их, чтобы тестовый код не раздувался и повторения не было. – gontrollez

+0

Но если бы я использовал реальные объекты, значит, это интеграционный тест больше единицы, не так ли? – user1016265