原则和 ZF2 - 单元测试,用于忽略 flush() 和非持久模拟对象


Doctrine and ZF2 - Unit Testing to ignore flush() and non-persisted mocked objects

尝试对我的服务模型进行单元测试,这些模型充斥着对我已处理实体的 Doctrine 的刷新命令。我收到错误,指出我的新模拟对象未持久化,并且关系没有新实体的级联选项。

看到这个后,我意识到我也不希望我的 flush() 操作转到数据库,因为它们只是对新实体的单元测试。

我该怎么做才能让 Doctrine 忽略模拟对象并忽略刷新操作?

现在我收到此错误:Fatal error: Command failed: PHP Fatal error: Call to a member function bindValue() on a non-object in /Users/person/Sites/project/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php on line 1311

    // Nullify EM
    $sm->setAllowOverride(true);
    $sm->setFactory('Doctrine'ORM'EntityManager', function ($sm) {
        $eventManager = null;
        $metadataCache = new 'Doctrine'Common'Cache'ArrayCache;
        $paths = $sm->get('Config')['doctrine']['driver']['application_entities']['paths'];
        $config = new 'Doctrine'ORM'Configuration();
        $config->setMetadataCacheImpl($metadataCache);
        $config->setMetadataDriverImpl($config->newDefaultAnnotationDriver($paths, false));
        $config->setQueryCacheImpl(new 'Doctrine'Common'Cache'ArrayCache);
        $config->setProxyDir(__DIR__ . '/Proxies');
        $config->setProxyNamespace('Doctrine'Tests'Proxies');
        $conn = array(
            'driverClass'  => 'Doctrine'Tests'Mocks'DriverMock',
            'wrapperClass' => 'Doctrine'Tests'Mocks'ConnectionMock',
            'user'         => 'john',
            'password'     => 'wayne'
        );
        $conn = 'Doctrine'DBAL'DriverManager::getConnection($conn, $config, $eventManager);
        return 'Doctrine'Tests'Mocks'EntityManagerMock::create($conn, $config, $eventManager);
});

我可以通过更改 Doctrine 的测试代码来修复上述问题,但这是不允许的。我尝试创建一个实体管理器的模拟,以使用模拟刷新存储在我的服务管理器中,但实体管理器是一个单例,因此无论如何都会返回自身的新实例。关于使用Doctrine的服务单元测试的信息绝对为零,所以在这一点上,我只需要假设这实际上是不可能的。

好的,所以在谷歌搜索了几天之后。我终于从奥克拉米乌斯那里得到了关于如何实际测试教义消费服务的答案:https://gist.github.com/Ocramius/3994325