【发布时间】:2020-03-18 08:13:25
【问题描述】:
简介
我正在运行一个包含多个微服务 (9+) 的系统。每个都是独立的微服务是 Laravel 的一个实例。
为了统一和集中部分代码库,我们创建了一个共享元素的外部私有作曲家存储库。其中包括模型、接口、特征、客户端等。例如,User 对象用于许多微服务。
这个 repo 不是 Laravel 安装,它只是“一些代码”,不需要包装器/可执行元素。它遵循标准作曲家结构(/src/ 等)。
我有一段代码可以进行一些验证。其中一个元素需要User 对象。这在现有代码库中完全有效。
我正在尝试对此代码进行单元测试以证明这一点。这就是问题的开始:
// The class:
namespace Example\Models\Core;
// ... other usual laravel use statements:
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
}
测试内部:
// ... other includes:
use Example\Models\Core\User;
class ClientTest extends TestCase
{
public function testUserIssue()
{
// attempt to instantiate an empty user:
$user = new User();
// other items:
}
}
当单元测试运行时,这会导致:
Error: Class 'Illuminate\Foundation\Auth\User' not found
User 类扩展了 Illuminate\Foundation\Auth\User。这是在供应商文件夹中。它似乎已正确自动加载,并且 PhPStorm 的“点击”自动类跳转按预期工作。
User 对象在 laravel 安装中加载和使用此 repo 时按预期运行。我所有的其他微服务都可以按预期使用User 对象
这在 composer update/install/dump-autoload 后仍然存在。
明确一点:我只是想将一个愚蠢的User 对象传递给一个类型提示函数。所需要的只是此函数中的一个属性 ($user->name)。不需要数据库查找或其他花哨的东西。
在里面使用下面的也是同样的失败:
-
$user = $this->createMock(User::class); -
$user = $this->createPartialMock(User::class, []);
问题 1
为什么这个类无法实例化/我该如何实例化它
问题 2
是否可以实例化一个忽略依赖关系的类...本质上是一个 stdClass() 或匿名类,它会覆盖另一个对象以进行测试?
【问题讨论】:
-
考虑将你的包转换成 Laravel 包,每个包都有模型、控制器等。请参阅 laravel 文档了解如何创建包。此外,这个包 orchestra/testbench 非常适合测试 Laravel 包。
标签: php laravel unit-testing