PHPunit:测试问题

时间:2018-11-19 15:00:46

标签: php mysql sqlite testing phpunit

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

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

但是我的问题是我在多个地方使用whereRaw,例如$query->whereRaw('STR_TO_DATE(CONCAT(的{​​{1}} date , " ",。这里的问题是sqlite没有MySQL具有的), "%Y-%m-%d %k") < ?', [$before]);STR_TO_DATE函数。因此,PHPUnut会因此引发很多错误。

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

为此,一个例子是我在基本TestCase CONCAT方法中具有以下内容:

setUp

除第一次以外,每次都失败,因为它说if (Schema::hasTable('gym_schedule') && !empty(GymSchedule::createGymSchedules())) { $this->artisan('db:seed', ['--class' => 'GymScheduleTableSeeder']); } 已经存在(a schedùle with id 1是我的主键)。我确实尝试过使用id截断每个测试类之间的所有表,但这根本无济于事,而且测试变得越来越慢,每个测试需要3秒。

所以基本上这种方法也不起作用。

我很茫然。我试过谷歌搜索并搜索StackOverflow。我对任何不太复杂的建议都持开放态度(要么以某种方式删除所有MySQL函数,解决MySQL的使用问题或其他问题)。

有人有个好主意吗?

1 个答案:

答案 0 :(得分:0)

关于问题的第一部分,在使用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();