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



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

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

我从Codeception文档中复制了示例代码,并使用我的实体名称对其进行了修改(以及修复错误(。

<?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)

[DoctrineORMORMInvalidArgumentException] A new entity was found through the relationship 'HMRXCoreBundleEntityAccountHolder#accountRole' that was not configured to cascade persist operations for entity: HMRXCoreBundleEntityAccountRole@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 'HMRXCoreBundleEntityAccountRole#__toString()' to get a clue.

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

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

它通过使用现有关系的回调来工作(至少在Codeception 4.x中(:

<?php
public function _beforeSuite()
{
$factory = $this->getModule('DataFactory');
$em = $this->getModule('Doctrine2')->_getEntityManager();
$factory->_define(AccountHolder::class, [
'firstName' => Faker::firstName(),
'accountRole' => function($entity) use ($em) {
$em->getReference(AccountRole::class)->find(1);
},
]);
}

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

相关内容

  • 没有找到相关文章

最新更新