我有一个接口,该接口定义了一种方法,该方法旨在在不满足条件时引发特定的异常。
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运行?)
在特征中编写测试,并在每个测试类中使用它。 (再次, PHPUnit可能不允许这种测试。)
我不确定其中哪些(如果有的话)被认为是好的单元测试实践。
答案 0 :(得分:0)
现在不必担心它是一个测试-如果是常规代码,您将如何编写代码来完成所需的工作?另外,最初复制和粘贴您编写的任何代码可能会更清晰,然后如果您需要第三个实例,则将其重构为一个通用调用-就像“普通”代码一样。
尽管确实有重复的可能,但我的确倾向于简单,明显的代码,尽管事实可能更“优雅”-特别是在测试中。最好的“优雅”或DRY代码可以隐藏一些含义。在业务逻辑中,这种抽象可能很好,但是正如我说的那样,我宁愿在测试中具有明确性。