如何使用Codeception FactoryMuffin中数据库中的现有数据?

时间:2019-12-03 22:45:00

标签: codeception faker factorymuffin

我正在尝试在验收测试中设置简单的测试数据:

  public function shouldUseAFakeAccountHolder(AcceptanceTester $I) {
    $I->have(AccountHolder::class);
    // ...
  }

我已经复制了the example code from the Codeception documentation并使用我的实体名称进行了修改(以及修正了错误)。

<?php
public function _beforeSuite()
{
     $factory = $this->getModule('DataFactory');
     // let us get EntityManager from Doctrine
     $em = $this->getModule('Doctrine2')->_getEntityManager();

     $factory->_define(AccountHolder::class, [
         'firstName' => Faker::firstName(),

         // Comment out one of the below 'accountRole' lines before running:

         // get existing data from the database
         'accountRole' => $em->getRepository(AccountRole::class)->find(1),

         // create a new row in the database
         'accountRole' => 'entity|' . AccountRole::class,
     ]);
}

使用现有数据'accountRole' => $em->getRepository(AccountRole::class)->find(1)的关系总是失败:

 [Doctrine\ORM\ORMInvalidArgumentException] A new entity was found through the relationship 'HMRX\CoreBundle\Entity\AccountHolder#accountRole' that was not configured to cascade persist operations for entity: HMRX\CoreBundle\Entity\AccountRole@0000000062481e3f000000009cd58cbd. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist  this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'HMRX\CoreBundle\Entity\AccountRole#__toString()' to get a clue.

如果我告诉它在相关表'accountRole' => 'entity|' . AccountRole::class中创建一个新条目,它可以工作,但是当它应该使用现有行时,它将添加行到表中。所有角色类型都是事先已知的,并且新的随机角色类型没有意义,因为代码中没有与之匹配的内容。创建重复的角色是可行的,但是再次为每个用户分配一个单独的角色类型很有意义,因为角色应该由用户共享。

在不使用Faker / FactoryMuffin的情况下,在单元测试而不是验收测试中,我曾遇到此错误,这与使用不同实例的关系访问关系的每个实体有关EntityManager。一旦我使用相同的实例获得了这两个部分,它就起作用了。我在这里看不到如何覆盖本地行为。

1 个答案:

答案 0 :(得分:0)

通过对现有关系使用回调,它可以工作(至少在Codeception 4.x中):

CertificateValidationProvider

我在这里找到它:https://github.com/Codeception/Codeception/issues/5134#issuecomment-417453633