【发布时间】:2016-04-24 13:17:06
【问题描述】:
我只是想了解在以下情况下编写单元测试的“正确方法”是什么:
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 构造方法实现单元测试,这将有助于确保在某个时候抛出异常
在这种情况下如何正确获取时间对象的模拟(不获取模拟意大利面条)?
【问题讨论】:
-
看起来你的 Time 类只是一个值对象,很可能它是不可变的。不要模拟值对象,只需创建它们。
-
@JakubZalas 是的,你是对的,这就是我之前所做的,但现在我遇到了问题,如果值对象的逻辑要改变,那么你所有的测试都会被破坏。认为维护这样的代码非常复杂。使用 Mock/Stub 对象可能会更容易
-
值对象没有复杂的逻辑。它们是价值观。
-
一些不变量可能已经够复杂了,但是你说得对,让它们尽可能简单是有意义的。好吧,想象一下 TimeRange 应该代表一天中从凌晨 2 点到第二天凌晨 2 点的时间段——这基本上代表了工作日。那么显示不变量就不会那么简单了。
标签: mocking phpunit fixtures stub