【问题标题】:Connecting to multiple databases with Codeception acceptance tests使用 Codeception 验收测试连接到多个数据库
【发布时间】:2015-05-28 18:59:37
【问题描述】:

我正在尝试弄清楚如何使用 Codeception 连接到多个数据库。我什至尝试过直接实例化一个新的 PDO 实例,但是 codept run 命令只是过早结束,没有错误消息。

我可以使用 Db 模块很好地连接到一个数据库,以使用诸如 $I->seeInDatabase() 之类的功能,但我无法连接到两个数据库。尝试在运行时使用 $this->getModule('Db')->_reconfigure() 重新配置 Db 模块也只是停止测试而没有任何消息。

有什么想法吗?

【问题讨论】:

  • 是否需要同时连接两个连接?如果没有,您可以使用不同的数据库连接参数配置不同的环境。
  • 不,我的意思是我什至可以关闭一个连接并将其更改为另一个连接,但我希望在同一个测试中拥有这两个连接,如果这就是你的要求吗?

标签: php unit-testing yii2 codeception acceptance-testing


【解决方案1】:

我能够通过以下方式实现这一目标:

套件配置文件:

actor: API_Tester
lint: true
colors: true
modules:
    enabled:
        - \Helper\Api
        - Asserts
        - REST:
            url: http://localhost
            depends: PhpBrowser
            part: Json
            headers:
              Accept: application/json
              Content-Type: application/json
        - Db:
            dsn: 'mysql:host=localhost;dbname=DATABASE1'
            user: 'DBUSER'
            password: 'DBPASSWORD'
            dump: 'tests/populate-DATABASE1.sql'
            populate: true
            cleanup: false
            reconnect: true
            populator: 'mysql -u $user -p$password -h $host $dbname < $dump'
            databases:
              DATABASE2_USE_THIS_NAME_IN_YOUR_CODE:
                dsn: 'mysql:host=localhost;dbname=DATABASE2'
                user: 'DBUSER'
                password: 'DBPASSWORD'
                dump: 'tests/populate-DATABASE2.sql'
                populate: true
                cleanup: false
                reconnect: true
                populator: 'mysql -u $user -p$password -h $host $dbname < $dump'

PHP测试代码:

        //Connect to the second database
        $I -> amConnectedToDatabase ( 'DATABASE2_USE_THIS_NAME_IN_YOUR_CODE' );
        $I -> seeNumRecords ( 1, 'users' );
        $I -> seeInDatabase ( 'users', [ 'email' => 'john@example.com' ] );
        //Connect back to the default database
        $I -> amConnectedToDatabase ( Codeception\Module\Db::DEFAULT_DATABASE );
        $I -> seeNumRecords ( 1, 'sessions' );
        $I -> seeInDatabase ( 'sessions', [ 'uniqueness' => $this -> uuid ] );

结果:

I am connected to database "DATABASE2_USE_THIS_NAME_IN_YOUR_CODE"
I see num records 1,"users"
I see in database "users",{"email":"john@example.com"}
I am connected to database "default"
I see num records 1,"sessions"
I see in database "sessions",{"uniqueness":"635c798c-05cd-4d9d-b79a-9643...}

【讨论】:

【解决方案2】:

我想这就是你想要的:https://github.com/Codeception/Codeception/issues/1634 ...但是,它还没有实现 - 也许你可以推动这个问题?

【讨论】:

  • 欢迎来到 Stackoverflow!尽量避免仅链接的答案。应该有足够的信息来单独提供答案,并且可以提供链接以获取更多信息。此外,如果您的链接中断,您的答案将变得毫无用处。我们希望您能坚持并帮助改善我们的社区!
  • 嗨丹尼斯,感谢您的建议!我试图改善我的信息。我想说的是,这个问题有一张公开的票,但它仍然悬而未决。如果我们有足够多的感兴趣的参与者,也许我们可以推动这个问题。
  • 即使只是一个链接也要贡献:github.com/natterbox/Codeception-MultiDb
  • 我不认为,官方网站上的功能请求链接不是一个好的答案。即使它只是一个链接。
【解决方案3】:

好吧!如果你不使用模拟数据库连接,你可以做我在 symfony 中使用 codeception 实现过一次的事情。

  1. Grab Doctrine 服务使用

    $doctrine = $I->grabService('Doctrine').
    
  2. 现在获取您在学说 ORM 部分中提到的数据库连接。

    $connection = $doctrine->getConnection('DB_Name_as_in_ORM')
    
  3. 您现在已连接到所需的数据库,现在您可以使用“doctrine dbal 连接方法”对此数据库中的表执行查询。

我想这也许就是你要找的东西!

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2014-02-01
    • 2017-03-25
    • 2016-11-03
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多