dongweihuai5601 2017-06-06 13:56
浏览 85
已采纳

Laravel多个数据库PHPUnit [重复]

This question already has an answer here:

I am developing a application with multiple database access and I want to have PHPUnit tests with this. My current approache is to have in the config\databases.php multiple connections (mysql, mysql2, mysql3) so I can have in the env file a different access for all of them. Because of this, the models have the $connection variable defined. In my first feature test I want to access a page and just see the data that I am providing in my factory, so just to get things started. In my phpunit.xml file I have specified the DB_CONNECTION to be sqlite and for each of the MySql setting to have the value=":memory:".

LATER EDIT

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE_1" value=":memory:"/>
    <env name="DB_DATABASE_2" value=":memory:"/>
    <env name="DB_DATABASE_3" value=":memory:"/>
</php>

So above you can find the relevant code from PHPUnit.

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db1
DB_USERNAME=xxx
DB_PASSWORD=xxx

DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=db2
DB_USERNAME_2=xxx
DB_PASSWORD_2=xxx

DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_3=db3
DB_USERNAME_3=xxx
DB_PASSWORD_3=xxx

The problem that I have is the fact that when I run the tests, i have this error -> PDOException: SQLSTATE[HY000] [1049] Unknown database ':memory:'.

So somehow Laravel is not parsing the memory value. Any suggestion will be mush appreciated. Thank you

</div>
  • 写回答

3条回答 默认 最新

  • douyingbei1458 2017-08-04 19:18
    关注

    I was having the same issue, but I got things working with some help from Adam Wathan on Twitter.

    Here's what I did:

    phpunit.xml:

    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value=":memory:"/>
    <env name="DB_CONNECTION_ACTIVITY_LOG" value="sqlite"/>
    <env name="DB_DATABASE_ACTIVITY_LOG" value=":memory:"/>
    

    config/database.php:

    'sqlite' => [
        'driver' => 'sqlite',
        'database' => env('DB_DATABASE', database_path('database.sqlite')),
        'prefix' => '',
    ],
    
    'mysql' => [
        'driver' => env('DB_CONNECTION', 'mysql'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
    
    'mysql-activity-log' => [
        'driver' => env('DB_CONNECTION_ACTIVITY_LOG', 'mysql'),
        'host' => env('DB_HOST_ACTIVITY_LOG', '127.0.0.1'),
        'port' => env('DB_PORT_ACTIVITY_LOG', '3306'),
        'database' => env('DB_DATABASE_ACTIVITY_LOG', 'forge'),
        'username' => env('DB_USERNAME_ACTIVITY_LOG', 'forge'),
        'password' => env('DB_PASSWORD_ACTIVITY_LOG', ''),
        'unix_socket' => env('DB_SOCKET_ACTIVITY_LOG', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
    

    .env:

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=my-app
    DB_USERNAME=root
    DB_PASSWORD=
    
    DB_CONNECTION_ACTIVITY_LOG=mysql-activity-log
    DB_HOST_ACTIVITY_LOG=127.0.0.1
    DB_PORT_ACTIVITY_LOG=3306
    DB_DATABASE_ACTIVITY_LOG=my-app
    DB_USERNAME_ACTIVITY_LOG=root
    DB_PASSWORD_ACTIVITY_LOG=
    

    Also, for anyone not up to the point of the PDOException, make sure to set the connections in your migrations/models, too.

    database/migrations/my_migration.php:

    Schema::connection(env('DB_CONNECTION_ACTIVITY_LOG', 'mysql'))->create(...);
    

    app/MyModel.php:

    class MyModel extends Model
    {
        public function __construct($attributes = [])
        {
            parent::__construct($attributes);
            $this->connection = config('app.env') === 'testing' ? 'sqlite' : 'mysql-activity-log';
        }
        ...
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测