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

11

我仍在为测试我的Symfony2控制器编写PHP单元测试。我的测试类是WebTestCase的派生类,测试会进行GET或POST请求来检查一切是否正常。 我想测试所有底层层次,但又不想用测试来破坏我的数据库。我也不想使用模拟,而是使用内存中的SQLite数据库,在其中设置一个测试场景以检查所有修改。 我发现很多如何使用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

3个回答

16

我从未使用过内存中的 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)

根据文档,您应该能够将其更改为内存方式。

http://docs.doctrine-project.org/projects/doctrine- dbal/en/latest/reference/configuration.html#pdo-sqlite

memory(布尔值):如果SQLite数据库应该是内存中的(非持久性),则为True。与路径互斥。路径优先。

因此,配置应为:

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

嗨,Melvin。首先,是的,这会起作用。但更改源代码不是我首选的方法,因为这些测试应该在专用服务器上自动运行。因此,默认连接不能被操纵,但有另一个第二个连接就可以了。测试本身应该编程地更改它们的默认连接。必须有一种方法来实现这一点。Hennes。 - Hennes
不确定是否理解您的意思,因此这可能是一个愚蠢的评论。但是,当您运行单元测试时,Symfony应该使用测试环境。例如,我的示例在Jenkins服务器和生产环境中都可以完美运行,因为只有在设置了测试环境时才会更改配置,config_test.yml将作为config.yml的覆盖加载,因此您的生产环境配置不会更改。 - melvin
啊,我的错,抱歉。我不知道单元测试会自动选择测试环境。所以我按照你提到的,在config_test.yml中实现了我的sqlite驱动程序。运行良好。谢谢。 - Hennes
在某些特殊情况下,您可能需要指定 memory: true 并明确设置 path: ":memory:",否则您将会从 Symfony 和 Doctrine 中得到投诉。 - tftd

9

被接受的答案对我无效,因为我正在使用URL指定连接参数,虽然我将驱动程序设置为pdo_sqlite并将memory设置为true,但Doctrine仍然使用根配置中的url参数,所以我不得不覆盖它。

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

2

您可以轻松地自己创建EntityManager实例。请检查helper class。虽然Symfony 2中可能没有它,但您可以使用这个想法构建自己的基础testCaseClass,并在需要时使用它。这甚至不需要启动内核。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接