phpunit:测试问题

qojgxg4l  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(398)

我在写测试时遇到了一个大问题。我使用laravel5.6.0作为框架,phpunit7.0进行测试。作为一个测试数据库,我在内存中使用了sqlite。这是我的 database.php :

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

但我的问题是我有好几个地方 whereRaw ,例如 $query->whereRaw('STR_TO_DATE(CONCAT( 日期 , " ",), "%Y-%m-%d %k") < ?', [$before]); . 这里的问题是sqlite没有 STR_TO_DATE 或者 CONCAT mysql拥有的函数。因此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秒。
所以基本上这种方法也不起作用。
我不知所措。我试过用google搜索这个并在stackoverflow中搜索。我愿意接受任何不太复杂的建议(要么以某种方式删除所有mysql函数,要么解决mysql的使用问题,要么真的解决任何其他问题)。
有人有好主意吗?

piztneat

piztneat1#

关于问题的第一部分,在使用 whereRaw() ,我是这样写方法的:

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

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

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

相关问题