PHPUnit имеет разное поведение для одного и того же кода
В настоящее время я пишу модульные тесты для класса-оболочки MySQL, который я написал.
Одним из тестов является проверка соединения с MySQL с использованием неверных учетных данных.
Это код класса c'or:
public function __construct($host, $userName, $password, $databaseName)
{
$this->m_sqlConn = new mysqli($host, $userName, $password, $databaseName);
if( !mysqli_connect_error() )
{
//...
}
else
{
throw new FailedToConnectDatabaseException( $this->getLastDatabaseErrorStr() );
}
}
Когда я отлаживаю свой PHP-код (с помощью XDebug), при создании нового mysqli не выдается ни ошибка, ни исключение
(Я запускаю эту строку:)
$conn = new MySQLConnection("localhost", "WRONG_USERNAME", "WRONG_PASSWORD", "NON_EXISTANT_DB");
но когда PHPUnit выполняет тот же код при тестировании:
public function test_wrongCredentials() {
$this->object = new MySQLConnection("localhost", "WRONG_USERNAME", "WRONG_PASSWORD", "NON_EXISTANT_DB");
}
доходит до обработчика ошибок, говоря
"mysqli::mysqli(): (HY000/1045): доступ запрещен для пользователя 'WRONG_USERNAME'@'localhost' (используется пароль: YES)"
В чем может быть причина, или есть что-то, чего я не знаю?
1 ответ
Ожидается, что вы получите исключение, так как ваш код специально его выбрасывает.
Чтобы справиться с этим в PHPUnit, используйте аннотацию, чтобы сообщить об "ожидаемом исключении". В вашем случае подходящей аннотацией является, как ни странно, @expectedException.
Итак, ваш тест должен выглядеть примерно так:
/**
* @expectedException FailedToConnectDatabaseException
*/
public function test_wrongCredentials()
{
$this->object = new MySQLConnection("localhost", "WRONG_USERNAME", "WRONG_PASSWORD", "NON_EXISTANT_DB");
}
Это должно сделать ваш тест успешным, не прибегая к использованию зла @.