php - Laravel 多数据库 PHPUnit

标签 php laravel laravel-5 phpunit

<分区>

我正在开发一个具有多个数据库访问权限的应用程序,我想对此进行 PHPUnit 测试。我目前的方法是在 config\databases.php多个连接(mysql、mysql2、mysql3),所以我可以在 env 文件中对所有连接进行不同的访问。因此,模型具有 $connection变量定义。在我的第一个功能测试中,我想访问一个页面并只查看我在工厂中提供的数据,所以只是为了开始。在我的 phpunit.xml文件我指定了 DB_CONNECTION成为sqlite并且每个 MySql 设置都有 value=":memory:" .

后期编辑

<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>

所以上面你可以找到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

我遇到的问题是,当我运行测试时,出现此错误 -> PDOException: SQLSTATE[HY000] [1049] Unknown database ':memory:' .

所以不知何故 Laravel 没有解析内存值。任何建议将不胜感激。 谢谢

最佳答案

我遇到了同样的问题,但我得到了一些 help from Adam Wathan on Twitter 的东西.

这是我做的:

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=

此外,对于任何未达到 PDOException 点的人,请确保也在您的迁移/模型中设置连接。

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';
    }
    ...
}

关于php - Laravel 多数据库 PHPUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44392039/

相关文章:

php - 在 laravel for sqlite 中找不到 pdo 异常驱动程序

php - 如何在 Eloquent 中为列命名别名

laravel - 在 Laravel 中使用 Sendmail 发送电子邮件的正确配置是什么?

php - 获取 2 个平均值为 `n` 的数字之间的 `x` 随机值

php - 拉维尔 Jquery : URLs are being read as &quot;

php - Laravel - 字段列表中的未知列

Laravel 密码重置电子邮件未在 Heroku 上使用 gmail 发送

php - Laravel Order By 关系计数,但关系中的属性是特定的

php - 将 Doctrine DBAL 添加到自己的 php 项目中

php - 正则表达式捕获两位数字仅当字符串中没有其他数字时