Это, наверное, легко для некоторых из вас. Я пытаюсь проверить защищенный метод на небольшом классе соединения с БД, который у меня есть.
Соответствующий код выглядит следующим образом:
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);
}
}
}
Чтобы протестировать метод, у меня была блестящая идея (вероятно, из какого-то поста здесь) подкласс и вызов оттуда. Я создал подкласс, прямо в нижней части моего тестового файла. Я, очевидно, не мог переопределить видимость метода для public, поэтому решил использовать другой подход в заглушке: объявить открытый метод, который вызывает защищенный родительский метод 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 выплевывает:
Неустранимая ошибка: вызов неопределенного метода DbConnect :: callLocalConnect () в C: \ tyrelinkCRMsync \ test
\ tirelinkCRMSync \ DBConnectTest.php в строке 82.
Объект правильно создан, но почему метод не определен, конечно, есть деталь, которая ускользнула от меня. Этот подход действителен или есть лучший способ?