【发布时间】:2011-09-01 18:51:06
【问题描述】:
这对你们中的一些人来说可能很容易。我正在尝试在我拥有的小型数据库连接类上测试受保护的方法。
相关代码如下:
class DbConnect{
/**
* Connexion MSSQL local
*/
protected function localConnect($localconfig){
$connectionInfo = array("UID" => $localconfig->uid,
"PWD" =>$localconfig->pwd,
"Database"=> $localconfig->DB);
$this->localConnection = sqlsrv_connect($localconfig->serverName,
$connectionInfo);
if( $this->localConnection === false ){
$sql_error = sqlsrv_errors();
throw new DBException("Error in DB Connection.\r\n
SQL ERROR:" . $sql_error);
}
}
}
为了测试该方法,我有一个好主意(可能来自这里某处的帖子)子类化并从那里调用。我在测试文件的底部创建了一个子类。我显然无法覆盖该方法对公共的可见性,因此决定在存根中使用另一种方法:声明一个调用父级受保护的 localConnect 方法的公共方法:
class DBConnectStub extends DBconnect{
public function callLocalConnect($localConfig){
parent::localConnect($localConfig);
}
}
我的测试现在看起来像这样:
/**
* @expectedException DBException
*/
public function test_localConnectError(){
$localconfig = (object) array ( 'serverName' => 'nohost',
'uid' => 'nouid',
'pwd' => 'noPwd',
'DB' => 'noDB'
);
$db = DbConnectStub::getInstance($localconfig, array());
$db->callLocalConnect($localConfig);
unset($db);
}
奇怪的部分,当我运行测试时,php 吐了出来:
致命错误:调用 C:\tirelinkCRMsync\test 中未定义的方法 DbConnect::callLocalConnect() \tirelinkCRMSync\DBConnectTest.php 在第 82 行。
对象已正确实例化,但为什么没有定义方法,肯定有一个细节让我无法理解。这种方法有效还是有更好的方法?
【问题讨论】:
-
这可能是由于 $localConfig 变量拼写错误。它应该是 $localconfig,不是吗?