【问题标题】:PHPunit: Problems with testingPHPunit:测试问题
【发布时间】:2019-04-21 23:19:51
【问题描述】:

我在编写测试时遇到了一个大问题。我使用 Laravel 5.6.0 作为框架,使用 PHPUnit 7.0 进行测试。作为一个测试数据库,我使用了带有内存存储的 sqlite。这是来自我的database.php

'sqlite_testing' => [
    'driver'   => 'sqlite',
    'database' => ':memory:',
    'prefix'   => '',
],

但我的问题是我有几个地方使用whereRaw,例如$query->whereRaw('STR_TO_DATE(CONCAT(date, " ",from), "%Y-%m-%d %k") < ?', [$before]);。这里的问题是 sqlite 没有 MySQL 具有的 STR_TO_DATECONCAT 函数。所以 PHPUnut 会因此抛出一堆错误。

我的解决方案是使用 MySQL 数据库作为测试数据库。但这似乎不起作用,因为我遇到了几个不同的错误,主要是我有几个外键约束失败的测试。

一个例子是我的基本测试用例setUp 方法中有以下内容:

if (Schema::hasTable('gym_schedule') && !empty(GymSchedule::createGymSchedules())) {
    $this->artisan('db:seed', ['--class' => 'GymScheduleTableSeeder']);
}

除了第一次之外,每次都会失败,因为它说a schedùle with id 1 已经存在(id 是我的主键)。我确实尝试使用tearDown 截断每个测试类之间的所有表,但这根本没有帮助,而且测试变得非常缓慢,例如每次测试需要 3 秒。

所以基本上这种方法也行不通。

我很茫然。我试过用谷歌搜索这个并通过 StackOverflow 搜索。我愿意接受任何不太复杂的建议(以某种方式删除所有 MySQL 函数,解决 MySQL 的使用或其他任何问题)。

有人有好主意吗?

【问题讨论】:

  • 你尝试resetting the databaseRefreshDatabase 特征吗?
  • @RamyHerrira 是的,我现在看到这个项目的前一个开发人员在每次测试中都使用了它,所以这是行不通的。
  • 怎么回事?你可以再详细一点吗 ?是否显示错误?
  • 我认为以不现实的方式测试您的应用程序有点多余
  • 老实说,我不知道是否有人可以使用 sqlite 查询成功测试复杂的 laravel 应用程序。 sqlite 现在面临同样的问题。 No such function CONCAT

标签: php mysql sqlite testing phpunit


【解决方案1】:

关于问题的第一部分,使用whereRaw() 时对 Laravel 应用程序进行单元测试,这就是我编写方法的方式:

    $raw_condition = "CONCAT(`country_code`, `number`) = ?"; 

    if (env('DB_CONNECTION') === 'sqlite') {
        $raw_condition = "(`country_code` || `number`) = ?";
    }

    return Model::whereRaw($raw_condition, [$number])->firstOrFail();

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 2019-11-22
    • 2018-06-28
    • 2021-02-08
    • 1970-01-01
    • 2014-02-24
    • 2017-01-30
    • 2021-12-26
    • 2019-01-14
    相关资源
    最近更新 更多