【问题标题】:Sharing PHPUnit tests between test cases在测试用例之间共享 PHPUnit 测试
【发布时间】: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,并且我需要这个测试来应用于这两种实现。

我可以看到三个选项:

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

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

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

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

【问题讨论】:

  • 您的代码本身并不是“DRY”。也许你可以从那里开始。
  • 忽略代码的细节。问题纯粹是关于如何最好地对接口的多个实现执行相同的测试。

标签: php phpunit


【解决方案1】:

现在不用担心它是用于测试的 - 如果是常规代码,您将如何编写代码来满足您的需求?此外,最初只需复制和粘贴您编写的任何代码可能会更清楚,然后如果您需要第三个实例,请将其重构为普通调用 - 就像“普通”代码一样。

然而,我确实倾向于简单、明显的代码,即使它也可能有重复,尽管它可能更“优雅”——尤其是在测试中。最好的'优雅'或DRY代码,可以隐藏一些含义。在业务逻辑中,这种抽象可能很好,但正如我所说,我宁愿在测试中明确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2015-01-30
    • 1970-01-01
    相关资源
    最近更新 更多