【问题标题】:Phpunit does not execute effective parent test case?Phpunit 不执行有效的父测试用例?
【发布时间】:2013-05-08 12:49:14
【问题描述】:

我目前正在使用 PHPUnit (CLI) 测试 API 的包装器。 由于测试的性质,我几乎可以使用相同的代码来测试两个不同的用例。唯一的区别在于我作为参数发送到 API 的值。

因此,我决定编写一个类 DefaultTest,在其中使用 API 使用的默认值测试 API,并在第二个 CustomTest(Case) 中使用不同的值测试我的参数容器。 CustomTest 继承自 DefaultTest,因为用于验证返回数据的所有函数在这两种情况下都是等效的。

这里有一些代码供你理解:

class DefaultTest extends PHPUnit_Framework_TestCase {

    public function testAPIMethod()
    {
        $this->checkParameterContainer();
        $this->validateResults();
    }

    public function checkParameterContainer() 
    {
        /* Set up default parameter container */
    }

    public function validateResults() 
    {
        /* Validate the results */
    }
}

class CustomTest extends DefaultTest {

    public function checkParameterContainer() 
    {
        /* Set up custom parameter container */
    }

    public function validateResults() 
    {
        parent::validateResult();
    }
}

PHPUnit 获取子类,执行 testAPIMethod,导致 CustomTest::checkParameterContainer() 和 DefaultTest::validateResults() 被执行。

但是 DefaultTest 的 testAPIMethod 永远不会被执行,因为 DefaultTest::checkParameterContainer() 永远不会被调用。

这两个类都是完全有效的 TestCases 并且 DefaultTest 在没有专门化时会正常执行。

那么,我想问你们:为什么会这样?我在这里想念什么吗?这是设计的吗?

【问题讨论】:

  • 似乎只有公共函数被设计调用。
  • Argh...更正我的示例代码(再次...)所有函数实际上都是公共的。
  • 你为什么要为不同的测试用例做两个类,而不是使用一个数据提供者为每个类提供不同的数据?因为数据是唯一改变的东西,你可以完全重用代码。
  • 很抱歉这么晚才回复您的评论。你是对的,这实际上是一个更清洁的方法来解决这个问题。我会相应地采用我的测试。感谢您的反馈意见。不过,我想知道为什么我的测试会显示这种行为,因为它实际上应该可以工作......

标签: php unit-testing phpunit


【解决方案1】:

如果有人需要它:PHPUnit 使用反射在每个类上查找测试方法,但不会在父类中搜索。因此子测试类中将需要以下内容:

public function testAPIMethod()
{
    parent::testAPIMethod();
}

【讨论】:

  • 感谢您的回答。我无法确认,因为该项目已经完成了一段时间。其他人可以确认这个事实,以便我可以将其标记为正确答案吗?
猜你喜欢
  • 2015-06-15
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
相关资源
最近更新 更多