Laravel 5.4 使用 SQLite 测试数据库时出现 ModelNotFoundException
Laravel 5.4 ModelNotFoundException when testing database with SQLite
我在 Laravel 5.4 的功能测试中遇到了问题。每当我尝试使用 SQLite 内存配置 运行 我的数据库测试时,我都会收到此错误:
1) Tests\Feature\ParseAccountingFilesTest::testExample
│/Middleware/ValidatePostSize.php(27):
Illuminate\Routing\Pipeline->Illuminate\R
Illuminate\Database\Eloquent\ModelNotFoundException: No query results
for model [App\QueuedAction] 1
我觉得奇怪的是,据我所知,这个错误通常只在查询构建器使用其中一种 -OrFail() 方法时遇到。当使用数据库队列驱动程序和 MySQL 作为数据库驱动程序时,我的代码在测试之外工作得很好。我已经调试了问题,发现是下面class构造函数中的如下语句引起的:
$this->scheduledAction = $action;
这个错误对我来说毫无意义。应该没有涉及查询,只有简单的分配。此 class 用作实际作业 class 的简单父级 class,以跟踪已排队的操作。
abstract class SchedulesOnce implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $scheduledAction;
public function __construct(string $id, string $type)
{
$action = new QueuedAction();
$action->id = $id;
$action->type = $type;
$action->save();
$this->scheduledAction = $action;
}
// Execute the job
public function handle()
{
$this->execute();
// Delete the queue reservation
$this->scheduledAction->delete();
}
// Child functionality
protected abstract function execute();
}
这是我的phpunit.xml
中的相关行
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php>
我真的不确定为什么会出现该错误,但早些时候我有一个类似的测试设置使用 Laravel 5.3。
从 5.4 升级到 5.5 似乎解决了我的问题。
我在 Laravel 5.4 的功能测试中遇到了问题。每当我尝试使用 SQLite 内存配置 运行 我的数据库测试时,我都会收到此错误:
1) Tests\Feature\ParseAccountingFilesTest::testExample
│/Middleware/ValidatePostSize.php(27): Illuminate\Routing\Pipeline->Illuminate\R Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\QueuedAction] 1
我觉得奇怪的是,据我所知,这个错误通常只在查询构建器使用其中一种 -OrFail() 方法时遇到。当使用数据库队列驱动程序和 MySQL 作为数据库驱动程序时,我的代码在测试之外工作得很好。我已经调试了问题,发现是下面class构造函数中的如下语句引起的:
$this->scheduledAction = $action;
这个错误对我来说毫无意义。应该没有涉及查询,只有简单的分配。此 class 用作实际作业 class 的简单父级 class,以跟踪已排队的操作。
abstract class SchedulesOnce implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $scheduledAction;
public function __construct(string $id, string $type)
{
$action = new QueuedAction();
$action->id = $id;
$action->type = $type;
$action->save();
$this->scheduledAction = $action;
}
// Execute the job
public function handle()
{
$this->execute();
// Delete the queue reservation
$this->scheduledAction->delete();
}
// Child functionality
protected abstract function execute();
}
这是我的phpunit.xml
中的相关行<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php>
我真的不确定为什么会出现该错误,但早些时候我有一个类似的测试设置使用 Laravel 5.3。
从 5.4 升级到 5.5 似乎解决了我的问题。