模拟一个类会导致其他使用原始类的测试出现问题

时间:2014-10-15 03:33:14

标签: mocking phpunit

我从以下测试开始,一切都很好:

class Search_Model_Mapper_Search_GetDbTableTest extends PHPUnit_Framework_TestCase
{
  public function testGetDbTable()
  {
    $mapper = new Search_Model_Mapper_Search();
    $dbClass = new ReflectionClass($mapper->getDbTable('Search_Model_DbTable_Search'));
    $this->assertEquals('Search_Model_DbTable_Search', $dbClass->getName());
  }
}

然后,我在其他地方添加了另一项测试:

class Search_IndexController_FulltextActionTest extends PHPUnit_Framework_TestCase
{
  public function testQueryNoResults() {
    $mapper = $this->getMockBuilder("Search_Model_Mapper_Search")
      ->disableOriginalConstructor()
      ->setMethods(array("find", "count"))
      ->getMock();
}

现在我收到致命错误Call to undefined method Search_Model_Mapper_Search::getDbTable()

我在原始测试中使用了反射来查找定义了Search_Model_Mapper_Search类的文件,它现在位于phar:///usr/local/bin/phpunit/phpunit-mock-objects/Framework/MockObject/Generator.php(335) : eval()'d code中,当我在反射类上调用getMethods时,我得到一个空数组。

如果我跳过或删除了嘲笑课程的测试,当我在原始测试中调用getMethods时,我会得到完整的方法列表。

是否有一些我错过的东西确保每个测试都运行得很干净,或者这是PHPUnit和/或PHPUnit Mock对象中的错误?

我通过phar

使用PHPUnit 4.3.1

1 个答案:

答案 0 :(得分:2)

这通常是因为原始类在被模拟之前未加载(或自动加载)。因此,模拟框架假设它不存在并创建一个虚拟类(没有方法)。

在嘲笑它之前尝试要求原始类。