参数#1必须是Model类型,给定的PestMockMock



我正在尝试使用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 AppModelsModelA, PestMockMock given

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

我试图找到一个解决方案,但到目前为止,我没有运气。我不明白我需要改变什么才能使它工作

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

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

话虽如此,您面临的问题是,mock()返回Pest Mock对象而不是Mock对象,该对象位于Pest Mock类的这里。这只能通过调用expect()返回。因此,使用expect(),使用您需要在mock上调用的操作,您的代码应该可以工作。

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");

相关内容

  • 没有找到相关文章

最新更新