参数 #1 必须是模型类型,Pest\Mock\Mock 给定
Argument #1 must be of type Model, Pest\Mock\Mock given
我正在尝试使用 Pest 编写一些测试并模拟我的模型。
我有一个接受两个模型的存储库,这是定义:
class MyRepo
{
public function __construct(private ModelA $modelA, private ModelB $modelB)
{
//
}
}
现在在我的测试中,我为 ModelA
和 ModelB
创建了两个 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()
returns Pest Mock 对象而不是 Mockery 对象,该对象位于 Pest Mock Class. This can only be returned by calling expect()
。因此利用 expect()
,您需要在模拟上调用的操作,您的代码应该可以工作。
mock(ModelA::class)
->shouldReceive('update')
->once()
->andReturn(true);
现在查看您的回答,我使用工厂更改了我的代码,并将该工厂传递到存储库。这是正确的方法吗?
getUser
是我要测试的方法,所以我用工厂创建了两个模型。是吗?
// prepare
$modelA = ModelA::factory()->create();
$modelB = ModelB::factory()->create();
$repository = new MyRepo($modelA, $modelB);
$service = new MyService($repository);
// act
$user = $service->getUser("fake");
我正在尝试使用 Pest 编写一些测试并模拟我的模型。 我有一个接受两个模型的存储库,这是定义:
class MyRepo
{
public function __construct(private ModelA $modelA, private ModelB $modelB)
{
//
}
}
现在在我的测试中,我为 ModelA
和 ModelB
创建了两个 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()
returns Pest Mock 对象而不是 Mockery 对象,该对象位于 Pest Mock Class. This can only be returned by calling expect()
。因此利用 expect()
,您需要在模拟上调用的操作,您的代码应该可以工作。
mock(ModelA::class)
->shouldReceive('update')
->once()
->andReturn(true);
现在查看您的回答,我使用工厂更改了我的代码,并将该工厂传递到存储库。这是正确的方法吗?
getUser
是我要测试的方法,所以我用工厂创建了两个模型。是吗?
// prepare
$modelA = ModelA::factory()->create();
$modelB = ModelB::factory()->create();
$repository = new MyRepo($modelA, $modelB);
$service = new MyService($repository);
// act
$user = $service->getUser("fake");