PHPunit:测试的问题

PHPunit:测试的问题,php,mysql,sqlite,testing,phpunit,Php,Mysql,Sqlite,Testing,Phpunit,我在编写测试时遇到了一个大问题。我使用Laravel 5.6.0作为框架,使用PHPUnit 7.0进行测试。作为一个测试数据库,我使用了sqlite和内存中的存储。这来自我的数据库.php: 'sqlite_testing' => [ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ], 但我的问题是,我有几个地方可以使用whereRaw,例如$query-

我在编写测试时遇到了一个大问题。我使用Laravel 5.6.0作为框架,使用PHPUnit 7.0进行测试。作为一个测试数据库,我使用了sqlite和内存中的存储。这来自我的
数据库.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\u-TO\u-DATE
CONCAT
函数。因此PHPUnut抛出了一系列错误

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

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

if (Schema::hasTable('gym_schedule') && !empty(GymSchedule::createGymSchedules())) {
    $this->artisan('db:seed', ['--class' => 'GymScheduleTableSeeder']);
}
除了第一次之外,每次都会失败,因为它说id为1的schedùle已经存在(
id
是我的主键)。我确实尝试使用
tearDown
截断每个测试类之间的所有表,但这一点都没有帮助,而且测试变得非常缓慢,每次测试大约3秒

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

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


有人有好主意吗?

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

你试过刷新数据库特性吗?@RamyHerrira是的,我现在看到这个项目的前一位开发人员在每次测试中都使用了这个特性,所以这不起作用。怎么会这样?你能说得更具体些吗?它是否显示了错误?我认为以一种不现实的方式测试应用程序是一种冗余。我不知道是否有人能够成功地使用sqlite查询测试复杂的laravel应用程序。sqlite现在也面临同样的问题<代码>无此类功能CONCAT