In unserer Anwendung setzen wir die Entitäten in statische Eigenschaften dieser Fixtures, so dass sie einfach aus Tests verwendet werden können.
class CategoryTestFixture
extends \Doctrine\Common\DataFixtures\AbstractFixture
implements
\Doctrine\Common\DataFixtures\OrderedFixtureInterface,
\Symfony\Component\DependencyInjection\ContainerAwareInterface
{
/** @var \My\Category */
public static $fooCategory;
/** @var \My\Category */
public static $barCategory;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
private $container;
public function load(ObjectManager $manager)
{
self::$fooCategory = new Category('Foo');
$entityManager->persist(self::$fooCategory);
self::$barCategory = new Category('Bar');
$entityManager->persist(self::$barCategory);
$entityManager->flush();
}
// you can inject the container,
// so you can use your Facades in fixtures
public function getContainer(): ContainerInterface
{
return $this->container;
}
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
}
Es gibt einige wichtige Regeln dazu:
- Stellen Sie sicher, rufen Sie nicht
$em->clear()
in Ihrer Spiele, so dass Sie direkt die Objekte in anderen Vorrichtungen Klassen verwenden können.
- Rufen Sie
$em->clear()
an, sobald die Geräte geladen sind, so dass sie Ihre Tests nicht beeinflussen.
- Erstellen Sie vor jedem Test eine Kopie der vorbereiteten Datenbank und verwenden Sie diese Kopie für Ihre Tests, nicht die "Template-Datenbank". So können Sie die Daten sicher ändern. Es kann weiter optimiert werden, aber dies ist die einfachste Lösung.
- Nicht zusammenführen oder versuchen, die ursprünglichen Fixtures in Ihren Tests als verwaltet zu registrieren.
Jetzt haben Sie die Armaturen erstellt haben, verwenden Sie sie wie diese
$id = CategoryTestFixture::$barCategory->getId();
Auch können Sie alle ihre Eigenschaften verweisen, nicht nur ids. Also wenn du sagen möchtest, dass deine API die richtigen Kategorien zurückgegeben hat, könntest du es so machen.
$this->assertArraySubset([
[
'id' => CategoryTestFixture::$fooCategory->getId(),
'name' => CategoryTestFixture::$fooCategory->getName(),
],
[
'id' => CategoryTestFixture::$barCategory->getId(),
'name' => CategoryTestFixture::$barCategory->getName(),
]
], $apiResponseData);
und wenn Sie wollen, um die Daten ändern nur für einen Testfall, verwenden Sie die Eigenschaften der Halterung Datenbank zu ändern und dann aftewards klar EM, so dass Sie in keine Nebenwirkungen, die mit bereits besiedelten Identität Karte erstellen der Entity Manager.
$barCategory = $entityManager->find(
Category::class,
CategoryTestFixture::$barCategory->getId()
);
$barCategory->setName('Another name');
$entityManager->flush();
$entityManager->clear();
Sie haben Ihre Frage mit Symfony nicht markieren, sondern durch hier zu lesen: https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#sharing-objects-between-fixtures könnte Ihnen einige Ideen. – Cerad
Nun, ich habe nicht, weil ich nicht mit Symfony arbeite :) Ich benutze Doctrine auch für Nette Framework. Aber schließlich endete ich mit diesem Ansatz von Symfony, also danke :) – amik