私たちのアプリケーションでは、これらのフィクスチャの静的プロパティにエンティティを設定しているため、テストから簡単に使用できます。
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;
}
}
これにはいくつかの重要なルールがあります。
- はあなたの備品で
$em->clear()
を呼び出すことはありませんので、あなたが直接、他の備品クラス内のエンティティを使用できることを確認します。
- フィクスチャがロードされると
$em->clear()
にコールしてください。テストには影響しません。
- すべてのテストの前に、準備されたデータベースのコピーを作成し、そのコピーを "テンプレートデータベース"ではなくテスト用に使用してください。したがって、データを安全に変更することができます。さらに最適化することができますが、これは最も簡単な解決策です。
- あなたのテストで元の治具を管理していたとして登録しないでください。
は、今では備品が作成していることを、あなたはすべてのそれらのプロパティだけではないIDを参照することができ、また、この
$id = CategoryTestFixture::$barCategory->getId();
のようにそれらを使用します。ですから、あなたのAPIが正しいカテゴリを返すと主張したければ、このようにすることができます。
$this->assertArraySubset([
[
'id' => CategoryTestFixture::$fooCategory->getId(),
'name' => CategoryTestFixture::$fooCategory->getName(),
],
[
'id' => CategoryTestFixture::$barCategory->getId(),
'name' => CategoryTestFixture::$barCategory->getName(),
]
], $apiResponseData);
、あなたはaftewards、ただ一つのテストケースのデータを修正するデータベースを変更するための固定具のプロパティを使用して、明確なEMたいので、あなたはすでに人口のアイデンティティマップと副作用を作成しない場合エンティティマネージャ
$barCategory = $entityManager->find(
Category::class,
CategoryTestFixture::$barCategory->getId()
);
$barCategory->setName('Another name');
$entityManager->flush();
$entityManager->clear();
あなたはsymfonyであなたの質問にタグを付けるが、ここを読んでいない:https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#sharing-objects-between-fixturesはあなたにいくつかを与えるかもしれませんアイデア。 – Cerad
私はSymfonyで動作しないので、私はしませんでした:)私はDoctrineをNetteフレームワークにも使用します。しかし、私は最終的にこのSymfonyのアプローチに終わったので、ありがとう:) – amik