首页 > 解决方案 > Laravel - 如何正确模拟/存根模型上的方法

问题描述

如何正确模拟/存根模型上的方法(在 laravel 中)?目前我正在尝试...

$mock = Mockery::spy(Organisation::class);
$mock->shouldReceive('findByCustomerId')->once();

被测代码是

use App\Organisation;
...
public function handle()
{
     $org = Organisation::findByCustomerId(1234);

但是,当我运行测试时,我得到一个错误Call to undefined method App\Organisation::findByCustomerId(),它告诉我类/模型没有被正确地模拟,有谁知道我哪里出错了?

标签: phplaravelphpunit

解决方案


当您为它们创建模拟时,Mockery 不会自动重载类(就像其他一些库可能做的那样)。它确实支持重载,但我不知道如何用部分模拟重载一个类。

所以看起来你必须使用依赖注入将模拟对象“注入”到正在测试的类中:

class TestedClass
{
    private $organisation;

    public function __construct(Organisation $organisation)
    {
        $this->organisation = $organisation;
    }

    public function handle()
    {
        $org = $this->organisation->findByCustomerId(1234);
    }
}

Laravel 会自动为您注入正确的对象。要注入模拟对象而不是Organization类,您可以在测试中执行以下操作:

$mock = \Mockery::spy(Organization::class)->makePartial();
$mock->shouldReceive('findByCustomerId')->once();
$this->app->instance(Organization::class, $mock);

推荐阅读