gpt4 book ai didi

doctrine-orm - PHPUnit 强制我模拟实体?

转载 作者:行者123 更新时间:2023-12-01 17:44:53 25 4
gpt4 key购买 nike

让我们考虑一下这种情况

public class FooManager()
{
//somewhere in my manager class code
public function merge(Foo $a, Foo $b, $id)
{
if ($a->getId() == $id) { //!! PAY ATTENTION !!
}
//and so on
}
}

我读过很多地方都说模拟实体不是一个好的做法,但我想知道那段特定的代码。

如果我无法将 Id 分配给真实的实体对象(例如,它是由学说自动生成的),那么如何在不模拟 Foo 实体的情况下测试此功能?

更新

我正在思考这个问题,脑海中闪现出一些东西:我在这里测试 FooManager,而不是实体。所以,对我来说,使用模拟不是唯一的解决方案,但也许是最好的。有人可以帮助我了解我的思维过程是否良好?

更新2

我之前没有提到过,但是,当然,我需要测试对 $a$b 的更改($a将从 $b 接收一些属性值,并相应地更新其属性)。这是测试的目标,因为 FooManager 的目标是将 $b 属性合并到 $a 属性中(当然,应用一些逻辑)

最佳答案

如果您需要绕过学说自动生成的实体ID策略,您可以通过元数据进行操作,并设置一个已知的ID。例如,如果您使用 DoctrineFixtureBundle 加载测试装置,则可以在您的装置中具有:

class FooFixtures  extends AbstractFixture implements OrderedFixtureInterface
{
public function load(ObjectManager $manager)
{

$metadata = $manager->getClassMetaData("Acme\\DemoBunde\\Entity\\Foo");
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
...
$foo = new Foo();
$foo ->setId(3);
$foo ->setTitle('Foo example');

然后在你的测试类中使用它

public function setUp()
{
parent::setUp();

$this->fooFixtures = new FooFixtures();

$this->loadFixtures(array($this->fooFixtures));
}

现在您的数据库中有一个 id 等于 3 的 Foo 实例

希望这对您有所帮助,并且我了解您的需求

免责声明:使用数据库 ID 对测试进行硬编码不是一个好习惯!!!

关于doctrine-orm - PHPUnit 强制我模拟实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32505007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com