【发布时间】:2018-12-21 04:00:59
【问题描述】:
我有一个接口,它定义了一个方法,该方法旨在在不满足条件时抛出特定异常。
interface PrizePotInterface
{
/**
* @throws PrizePotEmptyException
*/
public function claimPrize(EntryInterface $entry);
}
我有两个类实现了这个接口,两个类都有类似的逻辑来判断是否抛出异常。
class SequentialPrizePot implements PrizePotInterface
{
public function claimPrize(EntryInterface $entry)
{
if ($this->isEmpty()) {
throw new PrizePotEmptyException();
}
// prize claim logic
}
}
class RandomPrizePot implements PrizePotInterface
{
public function claimPrize(EntryInterface $entry)
{
if ($this->isEmpty()) {
throw new PrizePotEmptyException();
}
// prize claim logic
}
}
我需要编写一个单元测试来检查一个空的奖池是否抛出PrizePotEmptyException,并且我需要这个测试来应用于这两种实现。
我可以看到三个选项:
在每个测试类中编写相同的测试方法来检查 例外。简单易行,但不是很干。
让两个测试类继承一个共同的(抽象)
PrizePotTest检查异常的类。 (在父级中执行test*方法 类甚至可以由 PHPUnit 运行?)在 trait 中编写测试并在每个测试类中使用它。 (再次, PHPUnit 可能不允许这种测试。)
我不确定其中哪些(如果有)被认为是良好的单元测试实践。
【问题讨论】:
-
您的代码本身并不是“DRY”。也许你可以从那里开始。
-
忽略代码的细节。问题纯粹是关于如何最好地对接口的多个实现执行相同的测试。