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

我正在研究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('\The\NameSpace\TheEntity',$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 answerthis blog post找到一些灵感.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...