不可测试的基类扩展PHPUnit_Framework_TestCase。

27

概述

如何创建一个基类,扩展PHPUnit_Framework_TestCase,并将其用于继承实际测试用例,同时避免PHPUnit测试基类本身?

进一步解释

我有一系列相关的测试用例,我创建了一个基类,其中包含一些共同的测试,供所有测试用例继承:

BaseClass_TestCase.php:
class BaseClass_TestCase extends PHPUnit_Framework_TestCase { 
  function test_common() {
    // Test that should be run for all derived test cases
  }
}

MyTestCase1Test.php:
include 'BaseClass_TestCase.php';
class MyTestCase1 extends BaseClass_TestCase {
    function setUp() {
      // Setting up
    }
    function test_this() {
      // Test particular to MyTestCase1
    }
}

MyTestCase2Test.php:
include 'BaseClass_TestCase.php';
class MyTestCase2 extends BaseClass_TestCase {
    function setUp() {
      // Setting up
    }
    function test_this() {
      // Test particular to MyTestCase2
    }
}

我的问题是,当我尝试运行文件夹中的所有测试时,它会失败(没有输出)。

试图调试时,我发现问题出在基类本身是PHPUnit_Framework_TestCase的子类上,因此PHPUnit也会尝试运行其测试。 (在那之前,我天真地认为只有在实际测试文件中定义的类 - 文件名以Test.php结尾 - 才会被测试。)

由于特定实现的细节,将基类作为测试用例在上下文之外运行不起作用。

如何避免对基类进行测试,只测试派生类?


对于所有遇到类似问题的人,请查看此帖子,因为它可能会对您有所帮助:https://dev59.com/hGMk5IYBdhLWcg3w5Bzy#20074589 - Szymon Sadło
2个回答

44

抽象化它,PHPUnit 应该忽略它。


我的问题是我使用Yii框架,而Yii类自动加载器似乎无法识别抽象类。我收到错误消息Class 'unit/MasterDataValidatorTest' could not be found in '<project>/protected/tests/unit/MasterDataValidatorTest.php'.。你知道解决方法吗? :-) - physicalattraction
你不能使用final吗? - scruffycoder86
@Maximum86 你试过了吗?我没有。最终类仍然可以被实例化,所以我猜PHPUnit会将其视为测试类。 - Mike B

0

为了避免测试任何文件,您可以在phpunit.xml文件中将其排除。在您的情况下是<exclude>./tests/BaseClass_TestCase.php</exclude> 整个文件示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接