在编写测试时遇到了一个主要问题。我正在使用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的使用问题或其他问题)。
有人有个好主意吗?
答案 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();