0

我想在单元测试期间创建一些仅在测试环境中运行的实体。我不认为有一些退步的解决方案(我错了吗?),所以可能另一种方法是在测试文件夹中创建实体并使用它们。

但是有一点我不明白。Symfony 将BundleName\Entity文件夹设置为实体所在的文件夹,并且Tests/Entity文件夹不适用于我的实体。那么,如何Tests/Entity在我的测试用例中明确设置我的文件夹以工作(读取/安装/注册实体)?我假设这是通过配置学说实体管理器来完成的?

4

2 回答 2

2

在我的一个项目中发现了这个功能,可能对你有一点帮助。此函数创建新的 EntityManager,您可以在其中定义实体命名空间。

/**
 * @return EntityManager
 */
public static function createTestEntityManager()
{
    if (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers())) {
        self::markTestSkipped('This test requires SQLite support in your environment');
    }
    $config = new \Doctrine\ORM\Configuration();
    $config->setEntityNamespaces(array('SerializerBundleTests' => 'Top10\SerializerBundle\Tests\Entity'));
    $config->setAutoGenerateProxyClasses(true);
    $config->setProxyDir(\sys_get_temp_dir());
    $config->setProxyNamespace('SerializerBundleTests\Entity');
    $config->setMetadataDriverImpl(new AnnotationDriver(new AnnotationReader()));
    $config->setQueryCacheImpl(new \Doctrine\Common\Cache\ArrayCache());
    $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache());

    $params = array(
        'driver' => 'pdo_sqlite',
        'memory' => true,
    );

    return EntityManager::create($params, $config);
}
于 2013-09-07T04:01:36.510 回答
0

我可能错了,但我认为 Doctrine 的实体管理器不允许您动态添加其他实体的映射。

作为一个“棘手”的解决方法,您可以创建一个包含要用于测试的实体的附加包,然后将测试环境的 Symfony2 配置保持不变(如果您将“auto_mapping”设置为 true;请参阅此参考文档),同时为 dev 和 prod 环境更改 orm 配置。您需要禁用自动映射并明确指定捆绑包,从“映射”中排除带有仅测试实体的捆绑包。

或者,您甚至不需要指定 "auto_mapping" 的值。dev\prod 环境的配置(“entity_managers”、“mappings”)的相关部分应该看起来有点类似于说明书条目中的部分。

再次强调,我不能 100% 确定这个答案是正确的,因为我对 Symfony2 的了解变得有点模糊。

于 2013-09-06T16:44:09.313 回答