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");
}

Это должно сделать ваш тест успешным, не прибегая к использованию зла @.

Другие вопросы по тегам