Doctrine orm 使用SQLite内存数据库进行Symfony/Doctrine单元测试

Doctrine orm 使用SQLite内存数据库进行Symfony/Doctrine单元测试,doctrine-orm,phpunit,webtest,dbal,Doctrine Orm,Phpunit,Webtest,Dbal,我仍在进行PHP单元测试,以测试我的symfony2控制器。我的测试类是WebTestCase的派生,测试执行GET或POST请求,检查是否一切正常。 我想测试所有底层,但我不想让测试弄乱我的数据库。我不想使用实体模型,而是一个内存中的SQLite db,在这里我可以设置一个测试场景来检查所有修改。 我发现了很多关于如何使用doctrine 1.x实现这一点的提示,但它们不再有效。 所以我想要这样的东西: class BlahblahTest extends WebTestCase {

我仍在进行PHP单元测试,以测试我的symfony2控制器。我的测试类是WebTestCase的派生,测试执行GET或POST请求,检查是否一切正常。 我想测试所有底层,但我不想让测试弄乱我的数据库。我不想使用实体模型,而是一个内存中的SQLite db,在这里我可以设置一个测试场景来检查所有修改。 我发现了很多关于如何使用doctrine 1.x实现这一点的提示,但它们不再有效。 所以我想要这样的东西:

class BlahblahTest extends WebTestCase {
    public function testXXXYYY() {
        // 1. Setup a new database with SQLite:memory:
        // 2. create the database and all tables according the entities in my project
        $this->createTestScenario(); // 3.
        $crawler = $this->client->request('GET', '/testpage');  // 4.
        // 5. Lots of checks against the database and / or the $crawler data
    }
}
有机会得到这份工作吗

提前谢谢
Hennes

我从未使用内存中的sqlite数据库,但为了进行测试,我确实使用了保存的sqlite数据库

为此,你应该加上

# app/config/config_test.yml
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_sqlite
                path:     %kernel.cache_dir%/test.db
到您的测试配置(对于我config_test.yml)

您应该能够根据文档将其更改为内存中

内存(布尔):如果SQLite数据库应该在内存中(非持久),则为True。与路径相互排斥。路径优先

因此,配置应该是

# app/config/config_test.yml
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_sqlite
                memory:   true

您可以自己轻松创建entitymanager实例。选中此项,您可能在symfony 2中没有它,但您可以使用此想法构建自己的基本TestCase类,并在需要时使用它。这甚至不需要启动内核

接受的答案对我不起作用,因为我正在使用URL指定连接参数,尽管我正在将驱动程序设置为
pdo_sqlite
memory
设置为
true
,但条令仍然在使用根配置中的
URL
参数,因此我不得不覆盖它

#api/config/packages/test/doctrine.yaml
doctrine:
  dbal:
    url: "sqlite:///:memory:"

嗨,梅尔文。首先,是的,这是可行的。但更改源代码并不是我的首选方式,因为这些测试应该在专用服务器上自动运行。因此,不能操纵默认连接,但可以使用另一个连接。测试本身应该以编程方式更改其默认连接。一定有办法做到这一点。海恩斯,我不知道你是否理解,所以这可能是一句愚蠢的话。但是当您运行unittests时,symfony应该使用testenv。例如,我的示例在jenkins服务器和生产环境上运行得非常好,因为只有在设置了测试环境时配置才会更改。config_test.yml作为config.yml的覆盖加载,所以生产环境的配置不会更改。啊,我的错,对不起。我不知道,单元测试会自动选择测试环境。因此,正如您所提到的,我在config_test.yml中实现了我的sqlite驱动程序。很好。谢谢。在某些特殊情况下,您可能需要指定
memory:true
,并专门设置
路径:“:memory:”
,否则您将收到Symfony&doctor的投诉。