具有使用trait的抽象类的PHPUnit

具有使用trait的抽象类的PHPUnit,php,class,inheritance,phpunit,traits,Php,Class,Inheritance,Phpunit,Traits,我有一个抽象类DatabaseManager,它有相当多的孩子,比如General_db_manager、Data_Importer、Translation_manager等,这些孩子过去工作正常。当我没有运行我的单元测试时,它仍然正常工作 我刚刚写完这个需要数据库连接的ExceptionLogger类,但我不想让它成为DataBaseManager的子类,因为我计划在DataBaseManager中使用它(我想避免“死亡钻石”) 因此,我以如下方式发布了一些DatabaseManager代码:

我有一个抽象类DatabaseManager,它有相当多的孩子,比如General_db_manager、Data_Importer、Translation_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;   
    }
}
我在数据库管理器和例外日志中都包含了我的特点

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

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行(也是课堂上唯一的要求):

我的例外日志中也没有错误:

是否有人已经面临类似的问题

谢谢,


Jonathan Parent-Lévesque

以下是我的问题的解决方案,供感兴趣的人参考

首先,我尝试添加一个抽象类连接管理器,它将是异常日志记录器和数据库管理器的父级(这可能是一个比使用trait更好的设计…)

然而,我仍然有同样的问题:

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

以下是我的问题的解决方案,供感兴趣的人参考

首先,我尝试添加一个抽象类连接管理器,它将是异常日志记录器和数据库管理器的父级(这可能是一个比使用trait更好的设计…)

然而,我仍然有同样的问题:

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