在测试用例之间共享PHPUnit测试

时间:2018-07-12 20:19:34

标签: php phpunit

我有一个接口,该接口定义了一种方法,该方法旨在在不满足条件时引发特定的异常。

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,并且我需要将此测试应用于两种实现。

我可以看到三个选项:

  1. 在每个测试类中编写相同的测试方法以检查是否存在 例外。简单易用,但不是很干燥。

  2. 使两个测试类都继承一个公共的(抽象的)PrizePotTest 检查异常的类。 (在父级中执行test*方法 类甚至可以通过PHPUnit运行?)

  3. 在特征中编写测试,并在每个测试类中使用它。 (再次, PHPUnit可能不允许这种测试。)

我不确定其中哪些(如果有的话)被认为是好的单元测试实践。

1 个答案:

答案 0 :(得分:0)

现在不必担心它是一个测试-如果是常规代码,您将如何编写代码来完成所需的工作?另外,最初复制和粘贴您编写的任何代码可能会更清晰,然后如果您需要第三个实例,则将其重构为一个通用调用-就像“普通”代码一样。

尽管确实有重复的可能,但我的确倾向于简单,明显的代码,尽管事实可能更“优雅”-特别是在测试中。最好的“优雅”或DRY代码可以隐藏一些含义。在业务逻辑中,这种抽象可能很好,但是正如我说的那样,我宁愿在测试中具有明确性。