【问题标题】:Testing a User model outside Laravel在 Laravel 之外测试用户模型
【发布时间】: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


【解决方案1】:

关于问题1:

我能够使用include() 手动加载类。这并不令人满意,但让我找到了更合适的解决方案。

使用 composer 拉取单个类/依赖项并没有以 PSR-4 自动加载似乎喜欢的方式获取它们。

通过仅用 "laravel/framework": "^7.0" 替换单个作曲家库,内部结构似乎起作用了。

这会将代码耦合到 Laravel,这并不理想,但鉴于这些是 Laravel 微服务,这是意料之中的。还有比实际需要更多的代码,这会使供应商文件夹膨胀(如果只是用于公共文件存储库)。

关于问题2:

似乎没有办法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2015-02-15
    • 2015-06-25
    • 1970-01-01
    • 2022-12-03
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多