【发布时间】: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_DATE 或 CONCAT 函数。所以 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 database 与
RefreshDatabase特征吗? -
@RamyHerrira 是的,我现在看到这个项目的前一个开发人员在每次测试中都使用了它,所以这是行不通的。
-
怎么回事?你可以再详细一点吗 ?是否显示错误?
-
我认为以不现实的方式测试您的应用程序有点多余
-
老实说,我不知道是否有人可以使用 sqlite 查询成功测试复杂的 laravel 应用程序。 sqlite 现在面临同样的问题。
No such function CONCAT
标签: php mysql sqlite testing phpunit