Symfony 2 + Dottrina 2 + PHPUnit 3.5: la Serializzazione di chiusura eccezione

Ho provato a cercare qualcosa su Google, ma niente è venuto fuori. Ho un TestCase classe che eredita da WebTestCase, con alcuni metodi che voglio utilizzare in tutte le mie unità/test funzionali:

<?php

namespace Application\FaxServerBundle\Test;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Doctrine\Common\DataFixtures\Loader;
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;

use Application\FaxServerBundle\DataFixtures\ORM\NetworkConfigurationData;

class TestCase extends WebTestCase
{
    protected $kernel;

    public function setUp()
    {
        parent::setUp();
    }

    public function getEm()
    {
        return $this->getService( 'doctrine.orm.entity_manager' );
    }

    public function getNetworkConfigurationRepository()
    {
        return $this->getEm()->getRepository( 'Application\FaxServerBundle\Entity\NetworkConfiguration' );
    }

    public function loadNetworkConfigurationFixtures()
    {
        $loader = new Loader();
        $loader->addFixture( new NetworkConfigurationData() );

        $this->loadFixtures( $loader );
    }

    public function loadFixtures( $loader )
    {
        $purger     = new ORMPurger();
        $executor   = new ORMExecutor( $this->getEm(), $purger );
        $executor->execute( $loader->getFixtures() );
    }

    protected function getService( $name, $kernel = null )
    {
        return $this->getBootedKernel()->getContainer()->get( $name );
    }

    protected function hasService( $name, $kernel = null )
    {

        return $this->getBootedKernel()->getContainer()->has( $name );
    }

    protected function getBootedKernel()
    {
        $this->kernel = $this->createKernel();

        if ( !$this->kernel->isBooted() ) 
        {
            $this->kernel->boot();
        }

        return $this->kernel;
    }

    public function generateUrl( $client, $route, $parameters = array() )
    {
        return $client->getContainer()->get( 'router' )->generate( $route, $parameters );
    }
}

Quindi, il mio test di unità:

<?php

namespace Application\FaxServerBundle\Tests\Entity;

use Doctrine\ORM\AbstractQuery;

use Application\FaxServerBundle\Entity;
use Application\FaxServerBundle\Test\TestCase;

class NetworkConfigurationRepositoryTest extends TestCase
{
 public function setUp()
 {
  parent::setUp();

  $this->loadNetworkConfigurationFixtures();
 }

 public function testGetConfiguration()
 {
  $config = $this->getNetworkConfigurationRepository()->getConfigurationArray();

  $this->assertInternalType( 'array', $config );
  $this->assertEquals( 6, count( $config ) );
  $this->assertArrayHasKey( 'id', $config );
  $this->assertArrayHasKey( 'ip', $config );
  $this->assertArrayHasKey( 'gateway', $config );
  $this->assertArrayHasKey( 'subnetMask', $config );
  $this->assertArrayHasKey( 'primaryDns', $config );
  $this->assertArrayHasKey( 'secondaryDns', $config );
 }

 public function testGetConfigurationObject()
 {
  $config = $this->getNetworkConfigurationRepository()->getConfigurationObject();

  $this->assertInternalType( 'object', $config );
 }

 public function testGetConfigurationArray()
 {
  $config = $this->getNetworkConfigurationRepository()->getConfigurationArray();

  $this->assertInternalType( 'array', $config );
 }
}

Che stava lavorando prima, ma, improvvisamente, dopo che ho aggiornato il mio vendor (dottrina incluso), ha cominciato a lanciare questa eccezione:

3) Application\FaxServerBundle\Tests\Entity\NetworkConfigurationRepositoryTest::testGetConfigurationArray
RuntimeException: PHP Fatal error:  Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances' in -:32
Stack trace:
#0 [internal function]: PDO->__sleep()
#1 -(32): serialize(Array)
#2 -(113): __phpunit_run_isolated_test()
#3 {main}

Next exception 'Exception' with message 'Serialization of 'Closure' is not allowed' in -:0
Stack trace:
#0 -(0): serialize()
#1 -(113): __phpunit_run_isolated_test()
#2 {main}
  thrown in - on line 0

Ho scoperto che il problema deriva dal dispositivo di carico. Se io rimuovere il codice che carica infissi, funziona.

Qualcuno sa cosa potrebbe esserci di sbagliato nel mio codice? È questo il modo migliore di caricamento infissi?

Grazie!

InformationsquelleAutor Adrian | 2010-12-06



2 Replies
  1. 89

    Non tecnicamente relative al tuo problema. Tuttavia, ho avuto un momento davvero difficile cercare di risolvere la “Serializzazione di” Chiusura “non è consentito” problema durante l’utilizzo di PHPUnit, e questa domanda è il top di Google risultato.

    Il problema deriva dal fatto che PHPUnit serializza tutti i $GLOBALS nel sistema fondamentale di backup durante l’esecuzione del test. Poi li restituisce dopo il test è fatto.

    Tuttavia, se si dispone di eventuali chiusure nel vostro spazio GLOBALE, sta per causare problemi. Ci sono due modi per risolverlo.

    È possibile disattivare globale procedura di backup completamente utilizzando un’annotazione.

    /**
     * @backupGlobals disabled
     */
    class MyTest extends PHPUnit_Framework_TestCase
    {
        //...
    }

    O, se si sa che la variabile è la causa del problema (cercare una lambda in var_dump($GLOBALS)), si può mettere in blacklist il problema variabile(s).

    class MyTest extends PHPUnit_Framework_TestCase
    {
        protected $backupGlobalsBlacklist = array('application');
        //...
    }
    • Grazie per la tua risposta! questo è infatti quello che ho dovuto fare per risolvere la maggior parte dei miei problemi con questa eccezione. L’unico problema, a quanto pare, ho venuto dal Validatore componente di Symfony 2 nel mio test. Purtroppo, io non riuscivo a capire perché succede ancora.
    • Questo sarebbe stato un dolore a lavorare da me. +1 per la risposta utile
    • Questo sembra essere stato risolto in PHPUnit 3.6: github.com/sebastianbergmann/phpunit/pull/352
    • Questo può essere fatto anche per tutte le prove di comando tramite interruttore phpunit --no-globals-backup (phpunit.de/manual/3.6/en/textui.html) o tramite l’attributo corrispondente nella phpunit.xml file <phpunit backupGlobals="false" /> (phpunit.de/manual/3.6/en/…).
    • Anche non –processo di isolamento opzione, si traduce in “la Serializzazione di “Chiusura” non è consentito”. Testato con PHPUnit 3.7
    • Io uso un file di avvio, dove ho inizializzare alcuni oggetti globali necessari test e a sinistra, con alcuni riferimenti in ambito globale che ha causato l’eccezione. Eliminare i riferimenti dall’ambito globale rimosso l’eccezione.
    • Mi sono imbattuto in un problema correlato con --process-isolation – sembra PHPUnit, cerca per la serializzazione di oggetti provenienti in via dei fornitori di dati, come pure, e non si può fermare questo anche se si utilizza --no-globals-backup. Ho dovuto rielaborare il mio fornitore di dati e test per ottenere intorno a questo.
    • Grazie @Ted Kulp RE:”Questo sembra essere stato risolto in PHPUnit 3.6″ ho avuto questo problema quando ho cercato di PHPUnit 5.1.3 semplificate test su Yii2 (PHPUnit non Codeception)
    • Ho questo problema con symfony2 e phpunit 4.8.6 Se anche la versione 5.x ha lo stesso problema, quindi credo che un aggiornamento di phpunit, non sarà di aiuto.
    • Codeception: È possibile impostare settings.backup_globals: true in codeception.file yml.

  2. 4

    Si può anche provare.

    <phpunit backupGlobals="false">
        <testsuites>
            <testsuite name="Test">
                <directory>.</directory>
            </testsuite>
        </testsuites>
    </phpunit>

Lascia un commento