Attualmente sto affrontando un grosso problema. Durante un test unitario, utilizzo i dispositivi all'inizio del test per aggiungere dati in un database (tutto funziona correttamente) e vorrei usare lo stesso codice del dispositivo per aggiungere dati durante il test. Esempio:Symfony2, fixtures e unit test. Aggiungi dati di test durante il test in una relazione ManyToMany
Entity Persona:
class Person {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
[...]
/**
* @ORM\ManyToMany(targetEntity="Family", cascade={"persist"})
* @Assert\Count(min = "1")
*/
private $families;
public function __construct() {
$this->families = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addFamily(Family $family) {
$this->families[] = $family;
return $this;
}
[...]
}
Entity Famiglia:
class Family {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @Gedmo\Slug(fields={"name"})
* @ORM\Column(name="slug", type="string", length=255, unique=true)
*/
private $slug;
[...]
}
Infissi: Test
class Fixture1 implements FixtureInterface, ContainerAwareInterface {
/**
* @var Family[]
*/
public $families = array();
public function setContainer(ContainerInterface $container = null) {
$this->container = $container;
}
public function load(ObjectManager $manager) {
$this->manager = $manager;
$SmithFamily= $this->addFamily("Smith");
$this->addPerson("Will", "Smith", array($SmithFamily));
}
public function addFamily($name) {
$family = new Family();
$family->setName($name);
$this->manager->persist($family);
$this->manager->flush();
$this->families[$name] = $family;
return $family;
}
public function addPerson($firstName, $lastName, array $families = array()) {
$person = new Person();
$person->setFirstname($firstName);
$person->setLastname($lastName);
foreach ($families as $family) {
$person->addFamily($family);
}
$this->manager->persist($person);
$this->manager->flush();
return $person;
}
}
Unità:
class PersonTest extends WebTestCase {
public $fixtures;
protected function setUp() {
$client = self::createClient();
$container = $client->getKernel()->getContainer();
$em = $container->get('doctrine')->getManager();
// Purge tables
$purger = new \Doctrine\Common\DataFixtures\Purger\ORMPurger($em);
$executor = new \Doctrine\Common\DataFixtures\Executor\ORMExecutor($em, $purger);
$executor->purge();
// Load fixtures
$loader = new \Doctrine\Common\DataFixtures\Loader;
$this->fixtures = new Fixture1();
$this->fixtures->setContainer($container);
$loader->addFixture($this->fixtures);
$executor->execute($loader->getFixtures());
parent::setUp();
}
public function test1() {
$this->fixtures->addPerson("James", "Smith", array($this->fixtures->families['Smith']));
[...]
}
}
Quando eseguo il test, ottengo questo errore:
Doctrine \ DBAL \ Exception \ UniqueConstraintViolationException: Si è verificata un'eccezione durante l'esecuzione di 'INSERT INTO famiglia (lumaca, nome, create, last_updated_date, deleteddate) VALORI (?,?,?,?,?) 'con parametri ["smith", "Smith", "2015-01-10 13:59:28", "01-01-01 13:59:28" , null]: SQLSTATE [23000]: Integrità violazione del vincolo: 1062 duplicata du champ 'Smith' pour la clef 'UNIQ_A5E6215B989D9B62'
Questo errore indica che il campo "slug" deve essere univoco. Prova ad aggiungere una nuova famiglia, nonostante la famiglia esista già. Dovrebbe solo aggiungere una relazione tra la nuova Persona (James Smith) e La famiglia. Non capisco perché! Qualche idea?