具有抽象 class 使用特征的 PHPUnit
PHPUnit with abstract class using trait
我有一个摘要 class DatabaseManager 有很多 children 像 General_db_manager, Data_Importer、Translation_Manager 等,过去都可以正常使用。当我不 运行 我的单元测试实际上...
时它仍然正常工作
我刚写完这个 ExceptionLogger class 需要数据库连接,但我不希望它成为 [=39 的 children =]DataBaseManager 因为我打算在 DatabaseManager 中使用它(我想避免 "diamond of death")。
所以我将一些 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;
}
}
并且我在 DataBaseManager 和 ExceptionLogger.
中包含了我的特征
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
让我烦恼的是我的特质不需要任何 class。所以,我不太确定为什么它需要我的 GeneralDBManager class 这也是 DatabaseManager 的 children 和运行没有错误
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 行(也是 class 中唯一的要求):
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)
有人遇到过类似的问题吗?
谢谢,
乔纳森 Parent-L埃维斯克
这里是我的问题的解决方案,供感兴趣的人使用。
首先,我尝试添加一个抽象 class connection_manager,它将成为 exception_logger 的父级 和 database_manager(这可能是一个比使用 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.
为了形象化我的解决方案,假设您有一个像这样的测试 class:
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 的要求来解决问题,该要求恰好在 classes 的要求之前导致问题他们的测试文件中的问题。例如:
require_once(realpath(dirname(__FILE__)) . '/../../../general_controler/general_db_manager.php');
require_once(realpath(dirname(__FILE__)) . '/../backup_manager.php');
Et voilà,我的魔法开始起作用了!
FILE : BACKUP_MANAGER_TEST.PHP
PHPUnit 3.7.21 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 2.00Mb
OK (1 test, 9 assertions)
当然,这不是不寻求最佳class设计的借口,但它应该可以减轻一些绝望的可怜程序员的头痛。
祝你有愉快的一天,
来自蒙特利尔的 Jonathan Parent-Lévesque
我有一个摘要 class DatabaseManager 有很多 children 像 General_db_manager, Data_Importer、Translation_Manager 等,过去都可以正常使用。当我不 运行 我的单元测试实际上...
时它仍然正常工作我刚写完这个 ExceptionLogger class 需要数据库连接,但我不希望它成为 [=39 的 children =]DataBaseManager 因为我打算在 DatabaseManager 中使用它(我想避免 "diamond of death")。
所以我将一些 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;
}
}
并且我在 DataBaseManager 和 ExceptionLogger.
中包含了我的特征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
让我烦恼的是我的特质不需要任何 class。所以,我不太确定为什么它需要我的 GeneralDBManager class 这也是 DatabaseManager 的 children 和运行没有错误
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 行(也是 class 中唯一的要求):
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)
有人遇到过类似的问题吗?
谢谢,
乔纳森 Parent-L埃维斯克
这里是我的问题的解决方案,供感兴趣的人使用。
首先,我尝试添加一个抽象 class connection_manager,它将成为 exception_logger 的父级 和 database_manager(这可能是一个比使用 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.
为了形象化我的解决方案,假设您有一个像这样的测试 class:
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 的要求来解决问题,该要求恰好在 classes 的要求之前导致问题他们的测试文件中的问题。例如:
require_once(realpath(dirname(__FILE__)) . '/../../../general_controler/general_db_manager.php');
require_once(realpath(dirname(__FILE__)) . '/../backup_manager.php');
Et voilà,我的魔法开始起作用了!
FILE : BACKUP_MANAGER_TEST.PHP
PHPUnit 3.7.21 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 2.00Mb
OK (1 test, 9 assertions)
当然,这不是不寻求最佳class设计的借口,但它应该可以减轻一些绝望的可怜程序员的头痛。
祝你有愉快的一天,
来自蒙特利尔的 Jonathan Parent-Lévesque