【问题标题】:how to mock model->save()?如何模拟模型->保存()?
【发布时间】: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 出于安全原因,我不想从实际代码中添加更多内容。

标签: php laravel phpunit


【解决方案1】:

不确定,但我认为您需要将保存方法声明为:

$this->job->shouldReceive('save')->with(m::on(function ($job) use ($data) {
    // set all attributes of your job Model
    return 
        $job->id == $data['id']
        && $job->name == $data['name'];
        // ....
}))
  ->andReturns($this->job)
  ->once();

【讨论】:

  • 作业访问者也应该是->andReturns($this->job);
  • @apokryfos 它返回 $job 因为如果你在我提供的代码中。我需要实现一个带有值的工作模型,因为它是通过代码使用的。如果我返回 $this->job 代码将失败,因为作业模型为空。有几个地方可以访问 $job。
  • @Luke 创建一个partial mock,它大部分是真实的,但可以模拟调用,例如save
  • 好的,谢谢,我会看看部分模拟,这可能是我想要的。还有什么是m:on 我得到Error: Class 'm' not found @Vincent
  • 对于阅读本文的任何人,您都不会在 Laravel 中模拟核心类/方法。你只模拟 Facades。作者测试错误。他必须说明他为什么要这样做,因为有更好的解决方案。
猜你喜欢
  • 2016-01-21
  • 2015-02-24
  • 2018-11-08
  • 2021-02-07
  • 2020-01-04
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多