【问题标题】:PHPUnit with abstract class using trait具有使用特征的抽象类的 PHPUnit
【发布时间】:2015-06-23 21:09:38
【问题描述】:

我有一个抽象类 DatabaseManager,其中包含很多子类,例如 General_db_managerData_ImporterTranslation_Manager 等。以前可以正常工作。当我实际上没有运行我的单元测试时,它仍然可以正常工作......

我刚刚写完这个需要数据库连接的 ExceptionLogger 类,但我不希望它成为 DataBaseManager 的子类,因为我打算使用它在 DatabaseManager 中(我想避免“死亡钻石”)。

所以我把一些 DatabaseManager 代码放在这样的特征中:

trait ConnectionnHelper{


    protected static $support_user = "not_real_value";

    protected static $support_pass = "Not_real_value";

    protected static $whitelist = array('127.0.0.1.', "::1");


    /**
    * Return the host for a connection to our mysql server database.
    *
    * @return String
    */ 
    protected static function getMySqlHost() {

        $host = "";

        if (getenv('REMOTE_ADDR')) {

            if (in_array(getenv('REMOTE_ADDR'), self::$whitelist)) {

                $host = "127.0.0.1.";
            }
        }
        elseif (isset($_SERVER['REMOTE_ADDR'])) {

            if (in_array($_SERVER['REMOTE_ADDR'], self::$whitelist)) {

                $host = "127.0.0.1.";
            }
        }
        elseif(!getenv('REMOTE_ADDR') and !isset($_SERVER['REMOTE_ADDR'])) {

            $host = "127.0.0.1.";
        }

        return $host;   
    }
}

我的 DataBaseManagerExceptionLogger 都包含我的 trait。

abstract class DataBaseManager {

    use ConnectionHelper;

当我删除“use ConnectionnHelper”时,我的单元测试运行没有错误;但如果我保留它,我会收到这样的结果:

FILE : BACKUP_MANAGER_TEST.PHP

Fatal error: Class 'DataBaseManager' not found in C:\xampp\htdocs\general_controler\general_db_manager.php on line 14


FILE : GC_DATA_IMPORTER_TEST.PHP

Fatal error: Class 'DataBaseManager' not found in C:\xampp\htdocs\general_controler\general_db_manager.php on line 14

让我烦恼的是我的特点是不需要任何课程。所以,我不太确定为什么它需要我的 GeneralDBManager 类,它也是 DatabaseManager 的子类并且运行时没有错误

FILE : GENERAL_DB_MANAGER_TEST.PHP

PHPUnit 3.7.21 by Sebastian Bergmann.

.....

Time: 0 seconds, Memory: 2.75Mb

OK (5 tests, 22 assertions)

这是我在 GeneralDBManager 中的第 14 行(也是类中唯一的要求):

require_once(realpath(dirname(__FILE__)) . '../database_manager.php');

class generalDbManager extends DataBaseManager{

我的 ExceptionLogger 中也没有错误:

FILE : EXCEPTION_LOGGER_TEST.PHP

PHPUnit 3.7.21 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 2.75Mb

OK (1 test, 2 assertions)

有人遇到过类似的问题吗?

谢谢,

Jonathan Parent-Lévesque

【问题讨论】:

    标签: php class inheritance phpunit traits


    【解决方案1】:

    这里是我的问题的解决方案,供感兴趣的人使用。

    首先我尝试添加一个抽象类 connection_manager,它是 exception_loggerdatabase_manager 的父类(这可能是一个更好的无论如何设计而不是使用特征......)

    然而,我还是遇到了同样的问题:

    FILE : BACKUP_MANAGER_TEST.PHP
    
    Fatal error: Class 'DataBaseManager' not found in C:\xampp\htdocs\general_controler\general_db_manager.php on line 14
    

    看起来,PHP 似乎能够处理某种循环要求,但 PHPunit 却不行。

    为了可视化我的解决方案,假设您有一个像这样的测试类:

    require_once(realpath(dirname(__FILE__)) . '/../backup_manager.php');
    
    class BackupManagerTest extends phpunit_framework_testcase {
    
        public function setUp(){}
    
        public function tearDown(){}
    
        public function testGetBackupMode(){
    
            //test 1
            $myTag = BackupManager::getBackupMode("test");
    
            $this->assertNotEmpty($myTag);
    
            $this->assertContains('type="radio"', $myTag);
    
            $this->assertContains('value="1"', $myTag);
    
            $this->assertContains('value="2"', $myTag);
    
            $this->assertContains('id="1_RADIO" name="test" checked', $myTag);
    
            //test 2
            $myTag = BackupManager::getBackupMode("woot", BackupMode::BACKUP_SELECTED);
    
            $this->assertNotEmpty($myTag);
    
            $this->assertContains('id="2_RADIO" name="woot" checked', $myTag);
    
    
            //test 3
            $myTag = BackupManager::getBackupMode("blu", -10);
    
            $this->assertNotEmpty($myTag);
    
            $this->assertContains('id="1_RADIO" name="blu" checked', $myTag);
        }
    }
    

    我能够通过添加对 general_db_manager 的需求来解决问题,该需求会在测试文件中有问题的类的需求之前导致问题。举例:

    require_once(realpath(dirname(__FILE__)) . '/../../../general_controler/general_db_manager.php');
    require_once(realpath(dirname(__FILE__)) . '/../backup_manager.php');
    

    等等,我的魔法开始起作用了!

    FILE : BACKUP_MANAGER_TEST.PHP
    
    PHPUnit 3.7.21 by Sebastian Bergmann.
    
    .
    
    Time: 0 seconds, Memory: 2.00Mb
    
    OK (1 test, 9 assertions)
    

    当然,这不是不寻求最好的类设计的借口,但它应该可以让一些绝望的可怜的程序员感到头疼。

    祝你有美好的一天,

    来自蒙特利尔的Jonathan Parent-Lévesque

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 1970-01-01
      • 2022-01-19
      • 2014-03-04
      • 2011-04-12
      • 2010-11-16
      • 2015-02-14
      • 2010-12-31
      • 1970-01-01
      相关资源
      最近更新 更多