【发布时间】:2021-11-09 10:45:40
【问题描述】:
我需要模拟一个调用函数 save() 的数据库模型。
测试
//Setup function
$this->jobAccessor = Mockery::mock(JobAccessor::class);
$this->job = Mockery::mock(Job::class);
$this->app->instance('App\Models\Job', $this->job);
$this->app->instance('App\Data\JobAccessor', $this->jobAccessor);
//testing function
$job = new Job([
'id' => 22,
'user_id' => 123
]);
$this->jobAccessor->shouldReceive('find')
->with($jobId)
->andReturns($job);
$this->job->shouldReceive('save')->once();
要测试的功能
$job = $this->jobAccessor->find($this->id);
//do stuff with job then save
$job->save(); //how do I mock save here?
我如何模拟$job->save(); 上面的方法不起作用。我收到以下错误Illuminate\Database\QueryException: could not find driver。它仍在尝试访问数据库。
【问题讨论】:
-
你不模拟那个方法,你不模拟除 Facades 之外的任何核心类/方法......你为什么要模拟那个方法?如果您对此进行扩展,我可以帮助您创建一个好的测试,但您不必永远模拟该方法。
-
@matiaslauriti 如果您不希望它与 Db 对话,为什么不呢?
-
这就是问题所在,您与 DB 交谈或者您以另一种方式进行测试,但从不模拟像
Model这样的核心类。你能准确解释(编辑你的问题)你想测试什么吗?显示代码和依赖项,我将添加一个答案,解释并向您展示如何完成(正确的方式)。 -
@matiaslauriti 我不知道我是否可以添加任何其他内容来解释我在做什么。我基本上需要测试一个函数(您可以在
function to test部分看到它)但是当尝试测试该函数时,我收到错误,因为$job->save()正在尝试连接到数据库。我不想和数据库说话,那我怎么测试那个功能呢? -
@matiaslauriti 出于安全原因,我不想从实际代码中添加更多内容。