【发布时间】:2021-12-23 07:59:16
【问题描述】:
我有一个基于 Illuminate\Database\Eloquent\Model 的 Laravel User 模型。
它在我要进行单元测试的服务中使用。这就是为什么我想模拟具有某些属性的User,在这种情况下,它是关于应该设置为23 的id。
我通过以下方式创建我的模拟:
/**
* @param int $id
* @return User|\PHPUnit\Framework\MockObject\MockObject
*/
protected function createMockUser(int $id): \PHPUnit\Framework\MockObject\MockObject|User
{
$user = $this
->getMockBuilder(User::class)
->disableOriginalConstructor()
->getMock();
$user->id = $id;
return $user;
}
我也试过了:
$user->setAttribute('id', $id);
但在这两种情况下,模拟上的 id 属性将是 null。
如何在 Laravel 模型的 mock 上设置属性?
【问题讨论】:
-
我解决了我的问题,方法是不将模型注入我的服务,而是直接注入它的 id,但对于某些服务,这种方法仍然会崩溃(假设我想访问它上面的多个值)。在这种情况下,就足够了。
-
可以创建一个空的
User::class模型并设置id:new User(['id' => 23]);或者使用模型工厂:laravel.com/docs/master/… -
Mocking Laravel 模型不能解决任何问题,它可以使用工厂创建,而不是使用数据库,该功能可以使用 sqlite 数据库或类似数据库。如果您只需要访问属性,即使没有数据库访问权限的空模型也可以工作。
标签: laravel unit-testing eloquent mocking phpunit