在 Laravel 7 测试中使用自定义测试模型

Posted

技术标签:

【中文标题】在 Laravel 7 测试中使用自定义测试模型【英文标题】:Use custom testing model in Laravel 7 tests 【发布时间】:2021-06-28 08:22:40 【问题描述】:

我正在编写一个带有基本方法的基本存储库,以便从其他存储库扩展它,例如:

BaseRepository
  ├─ UserRepository
  ├─ PostRepository
  └─ CommentRepository

我想用自定义测试模型测试我的BaseRepository,而不是使用实际应用程序模型(例如UserPost 等),所以我需要创建这个自定义模型及其迁移并使用它们仅在测试期间,但我更喜欢将 tose 文件放入 tests 文件夹以保持结构清洁。

有没有办法告诉 laravel 仅在测试期间加载 app/database/migrations 以外的其他迁移?

更新 #1:为什么

我想单独测试我的BaseRepository 类,所以我不会在存储库测试中使用我的任何应用程序模型,因为可能/将来对这些模型的修改/更新可能会导致存储库测试出错,例如从代码库中弃用并随后删除该模型。

这就是为什么我更喜欢使用创建的自定义模型,只是为了在我的存储库测试中使用。

【问题讨论】:

为什么不创建另一个数据库进行测试,然后创建.env.testing,并配置该数据库laravel.com/docs/8.x/testing#environment 这不是我要的,我要问的是如何迁移文件不在标准app/database/migrations 文件夹中的迁移,并且仅在测试期间进行 我只是想知道为什么您需要在其他文件夹中进行其他迁移?你能解释一下那部分吗? 更新了问题以更好地解释原因。 如果您的存储库依赖于模型,那么如果您更改模型中的某些内容,您还需要更新存储库测试。如果您创建另一个虚拟模型,那么每次使用您测试的虚拟模型进行测试总是会成功,那么将来如果您在真实模型中更改某些内容,然后运行测试,测试会正常,但真实代码会损坏,因为您在测试中的 repo 依赖于未更新的虚拟模型。 【参考方案1】:

我发现我可以在我的测试类中使用setUp/tearDown 方法中的Schema 外观在每次测试之前/之后为我的自定义模型创建/删除表,我实际上并没有需要一个迁移文件。

环顾四周,我发现了这个 laravel 包 lazychaser/laravel-nestedset:它创建了一种新类型的递归关系,并包含一个用虚拟模型测试的特征,就像所说的那样创建它的表。

【讨论】:

以上是关于在 Laravel 7 测试中使用自定义测试模型的主要内容,如果未能解决你的问题,请参考以下文章

关于yolov5-v7模型的自定义模型加载测试问题

关于yolov5-v7模型的自定义模型加载测试问题

关于yolov5-v7模型的自定义模型加载测试问题

如何在不安装完整框架的情况下测试自定义 Laravel 控制台命令?

Laravel:在自定义 Route::model 绑定中使用模拟实例

我在哪里把自定义代码放在 Laravel