2016-04-24 45 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单元测试构造函数的方法,这将有助于确保异常抛出在某一点

如何在这种情况下正确地获得时间对象的模拟(没有得到模拟意大利面条)?

+0

看起来你的时间类只是一个值对象,最有可能是不可变的。不要模拟价值对象,只是创建它们。 –

+0

@JakubZalas是的,你是对的,这是我以前做的,但现在我遇到了问题,如果值对象的逻辑将被改变,那么你的所有测试将被毁掉。在看来,它使维护这样的代码非常复杂。使用模拟/存根对象可能更容易 – user1016265

+0

值对象不具有复杂的逻辑。他们是价值观。 –

回答

0

模拟创作可能变得相当复杂。在生产代码中,复杂的任务由专门的类或模块处理。在这种情况下,它是一样的。你可以并且应该抽象出类和存根的创建。这些类应该是测试套件的一部分。

以你为例。你可以有一个类,将返回具有一定的小时,分​​钟初始化的对象Time,第二:

这里是的xUnit设计模式书的链接的相关章节。有很多的模式只是创造嘲笑:

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

+0

感谢您的链接,您认为使用模仿与真实对象,如Jakub Zalas上面提出的建议是什么? – user1016265

+0

我同意。尽可能使用真实的物体。如果没有必要,不要让事情更加复杂。但是,当必须使用模拟或存根时,模拟创建不是微不足道的,有一些帮助类创建它们是有用的,因此测试代码不会变得臃肿,也不会重复。 – gontrollez

+0

但是如果我使用真实物体,这意味着它是一个比单位更多的综合测试,对吧? – user1016265