laravel - 参数 #1 必须是模型类型,Pest\Mock\Mock 给定

标签 laravel phpunit php-8 php-pest

我正在尝试使用 Pest 编写一些测试并模拟我的模型。 我有一个接受两个模型的存储库,这是定义:

class MyRepo
{
    public function __construct(private ModelA $modelA, private ModelB $modelB)
    {
      //
    }
}

现在在我的测试中,我为 ModelAModelB 创建了两个 mock,并创建了存储库:

$modelA = mock(ModelA::class);
$modelB = mock(ModelB::class);

$repo = new MyRepo($modelA, $modelB);

运行这段代码我得到了这样的检查错误:

__construct(): Argument #1 ($modelA) must be of type App\Models\ModelA, Pest\Mock\Mock given

如果我删除 Repository 构造函数的类型检查,一切正常。

我试图找到解决方案,但就目前而言,我没有运气。我无法理解我需要更改什么才能使其正常工作

最佳答案

如评论所述,不要模拟模型,这不是 Laravel 中测试工具的预期用途。换句话说,我已经编写了数千个测试,而且没有一次我不得不模拟模型。

将模型作为构造函数的参数是没有意义的。由于 Laravels 容器通常只是将它们解析为空模型,使用 resolve(MyRepo::class); 并且容器是 Mocking 的基本工具。

话虽如此,您面临的问题是,mock() 返回 Pest Mock 对象而不是 Mockery 对象,该对象位于 Pest Mock Class 上.这只能由 calling 返回期望()。因此,利用 expect(),以及您需要在模拟上调用的操作,您的代码应该可以正常工作。

mock(ModelA::class)
    ->shouldReceive('update')
    ->once()
    ->andReturn(true);

关于laravel - 参数 #1 必须是模型类型,Pest\Mock\Mock 给定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69769043/

相关文章:

php - 如何在 PHP 8.1 中使用反射更改只读属性?

php - 为什么 str_contains 可以在我的 PHP 7.4 的 Symfony 项目中工作?

php - Laragon 4.0.15 - 切换到 PHP 8 后 Apache 无法启动

php - Laravel Eloquent 模型中的字段

php - Laravel Intervention Image GD 库扩展

cakephp - 在 CakePHP 2 中制作 phpunit.xml

php - 发送电子邮件的事件监听器测试

javascript - jQuery 选择器不适用于数据表

php - Laravel 7 组件中的 undefined variable

php - 在 phpunit 中连接约束