加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

symfony – 如何创建没有持久化的Doctrine实体的测试(如何设置id

发布时间:2020-12-13 17:36:28 所属栏目:PHP教程 来源:网络整理
导读:我正在研究Symfony2项目的测试,现在我正在寻找一种方法来创建涉及实体对象的测试,而不会坚持它们.问题是:id是一个私有字段,没有setter.我可以创建新对象并设置一些属性,但是我无法测试涉及getId()调用的任何内容. $entity = new TheEntity();// Can't set I
我正在研究Symfony2项目的测试,现在我正在寻找一种方法来创建涉及实体对象的测试,而不会坚持它们.问题是:id是一个私有字段,没有setter.我可以创建新对象并设置一些属性,但是我无法测试涉及getId()调用的任何内容.
$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');

$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null

我知道的决议:

>初始化整个内核(Symfony的WebTestCase :: createKernel())并持久化实体
>为每个实体创建一个模拟对象,这将返回有效的ID
在Http中,类似静态方法在TheEntity类中返回初始化的对象,或者为id字段添加setter

有什么建议的方法来处理这个问题,如何以干净,快速的方式获得测试实体?

编辑

原来我可以用嘲笑解决这个…抱歉,我还在学习.我正在寻找一个干净,标准,但快速的方式来完成工作.但是我忘记了getMock()的第二个参数 – 那就是我不必模拟我要使用的实体的每一个方法.我想避免多个 – > expects() – > method() – > will()等.这是通过添加:array(‘getId’)来实现的.这个帮助方法解决了这个问题:

protected function getEntityMock($entityClass,$id)
{
    $entityMock = $this->getMock($entityClass,array('getId'));
    $entityMock
            ->expects($this->any())
            ->method('getId')
            ->will($this->returnValue($id));

    return $entityMock;
}

当创建同一个类的许多实体时,当然可以通过像这样的更多帮助方法来简化事情:

protected function getTheEntityMock($id)
{
    return $this->getEntityMock('TheNameSpaceTheEntity',$id);
}

唯一的限制是实体本身不能使用id属性,只能使用getId()getter.

任何有价值的输入仍然受欢迎,但我相信PHPUnit的getMock()解决了这个很好.

您可以在应用程序/ config / config_test.yml中配置原则以使用内存中的数据库.
# app/config/config_test
doctrine:
  dbal:
    driver: pdo_sqlite
    path: :memory:
    memory: true

这样可以加快进程速度,并且可以在setUp()方法中快速地保留一些装置,该方法将在自动生成的id之后刷新所有数据,而不会弄乱“真实”数据库.

您可以在this answer和this blog post找到一些灵感.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读