gpt4 book ai didi

php - 如何模拟 Laravel Eloquent 访问器属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:54 25 4
gpt4 key购买 nike

我正在我的 Laravel 4 应用程序中实现单元测试,但我被困在模拟访问器属性上。

我有一个 Eloquent 模型,其中有一个 Accessor 属性。我正在尝试模拟此模型并在调用此访问器属性时返回一个值。但我找不到任何让它工作的解决方案。

我 super 简单的用户类。

class User extends Eloquent {
public function getFullNameAttribute() {
return $this->first_name . ' ' . $this->last_name;
}
}

我尝试了以下方法:

$user_mock = m::mock('MyApp\Models\User');

$user_mock->shouldReceive('__get')->with('full_name')->andReturn('John Snow'); // doesn't work
$user_mock->shouldReceive('getAttribute')->with('full_name')->andReturn('John Snow'); // doesn't work
$user_mock->shouldReceive('getFullNameAttribute')->andReturn('John Snow'); // doesn't work

echo $user_mock->full_name; // --> " "

我只是得到一个空的空格,说明原来的函数还在被调用。

最佳答案

尽量不要 mock Eloquent 模型。这是“模拟您不拥有的类型”的示例。如果 Laravel 在新版本中更改了 Eloquent 内部结构,并且您在单元测试中模拟了它们,那么您的测试可能会提供误报。

此外,我认为尝试和 mock 他们很奇怪。您失去了这些实体映射到现实世界事物的想法,而需要隔离测试的是业务逻辑组件(依赖性被模拟)。

当使用访问器时,我发现将它包装在另一个抽象中很有帮助,例如在 Repository 层中:

public function getFirstNameAttribute()
{
return app(UserRepository::class)->getFirstName($this);
}

我发现访问器使客户端代码非常可读。这是完全可测试的,并且与数据库的整个交互是可模拟的,如果您有数千个测试,这可能有助于减少开销。

关于php - 如何模拟 Laravel Eloquent 访问器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30664743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com