phpunit Вы не можете сериализовать или десериализовать экземпляры PDO - PullRequest
0 голосов
/ 10 мая 2018

Я использую PHPUnit с processIsolation = "true", потому что мне нужно установить значение cookie в коде, который я тестирую, и без processIsolation = "true" это невозможно сделать.Но в одном из моих тестовых случаев я получаю сообщение об ошибке:

PHPUnit_Framework_Exception: [10-May-2018 15:23:28 UTC] PHP Fatal error:  Uncaught PDOException: You cannot serialize or unserialize PDO instances in -:394
Stack trace:
#0 [internal function]: PDO->__sleep()
#1 -(394): serialize(Array)
#2 -(536): __phpunit_run_isolated_test()
#3 {main}
  thrown in - on line 394

Контрольный пример:

public function testUserCookieIsSavedToClicksTable()
{
    $cookie = sha1('12345');
    $_COOKIE['user_cookie'] = $cookie;
    $offerId = 1;
    $tx = $this->getTx($offerId);

    // Go
    $this->controller = new ClickController(new Click(new Database(Cache::getInstance()), new Queue, new RedisStorage()));
    $this->runLocal([1, $this->userId], null);

    $sql = 'select * from clicks order by id desc limit 1';
    $click = $this->db->query($sql, [], 'fetch');
    $this->assertEquals($tx, $click['tx_id']);
    $this->assertEquals($click['user_cookie'], $cookie);
}

Эта ошибка возникает при вызове любого из $this->assertEquals($tx, $click['tx_id']); или $this->assertEquals($click['user_cookie'], $cookie);.Но я могу var_dump любые переменные, используемые в этих утверждениях.

Я попробовал все решения из здесь , но они не работают для меня

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Изоляция процесса требует, чтобы все объекты в изолированном процессе могли быть сериализованы / не сериализованы.

Вы видите ошибку, касающуюся конкретного объекта, который не поддерживает сериализацию / десериализацию объектов PHP.

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

Если вы немного пережеваете это и измените некоторые мысли о том, что здесь происходит, ипочему некоторые объекты (например, соединения с базой данных), как правило, не могут быть сериализованы, а также, почему изоляция процессов может также использовать сериализацию, возможно, приходит на ум, почему изоляция процессов для соединений с базами данных, в конце концов, не очень хорошая идея.

Так что, хотя вы видите здесь техническое ограничение, которое вызывает ошибку, в конце я бы сказал, что имеет смысл не запускать тесты на основе соединения с базой данных в изолированных процессах как часть одного и того же набора тестов.

Возможно, это не тот ответ, который выop. for.

Возможно, «разделяй и властвуй» может иметь здесь смысл: поместите те тесты, для которых изоляция процесса работает, в собственный набор тестов и настройте для него изоляцию процесса.

Для другого выполнитеТо же самое относится и к собственному тестовому пакету.

XML-файл конфигурации PHPUnit предлагает настройки для их создания, иногда даже необходимо иметь несколько таких XML-файлов конфигурации, немного зависит от используемой версии Phpunit, но также и для параметров конфигурации для тест-бегуна.

0 голосов
/ 12 мая 2018

Вероятно, это ошибка в вашем db компоненте.Он должен реализовать метод __sleep(), чтобы убедиться, что экземпляр PDO не сериализован с ним (и, возможно, реализовать __wakeup() для повторного подключения после десериализации).

Вы не поделились какой-либо информацией о db компоненте, но этого можно достичь примерно так:

public function __sleep() {
    $fields = (array) $this;
    unset($fields['pdo']);
    return array_keys($fields);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...