在 Laravel 7 测试中使用自定义测试模型
Posted
技术标签:
【中文标题】在 Laravel 7 测试中使用自定义测试模型【英文标题】:Use custom testing model in Laravel 7 tests 【发布时间】:2021-06-28 08:22:40 【问题描述】:我正在编写一个带有基本方法的基本存储库,以便从其他存储库扩展它,例如:
BaseRepository
├─ UserRepository
├─ PostRepository
└─ CommentRepository
我想用自定义测试模型测试我的BaseRepository
,而不是使用实际应用程序模型(例如User
、Post
等),所以我需要创建这个自定义模型及其迁移并使用它们仅在测试期间,但我更喜欢将 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 测试中使用自定义测试模型的主要内容,如果未能解决你的问题,请参考以下文章
如何在不安装完整框架的情况下测试自定义 Laravel 控制台命令?