基于数据库种子器的特性测试
发布时间 作者 Eric L. Barnes
在 2018 年的 Laracon AU 上,David Hemphill 做了一个题为 "为了娱乐和利益而滥用 Laravel" 的演讲,其中一部分内容我发现很有趣,是关于基于数据库种子器的特性测试。
David 讲述了一些在测试之前设置数据的常见方法,例如使用 `setUp` 方法、trait,然后他开始在测试中使用自定义种子器。
种子器的优势之一是你可以为特定的情况创建它们,并在你的测试中直接调用 `$this->seed`,而不是到处使用工厂。例如:
class WebhookTest extends TestCase { function setUp() { $this-›seed( 'UserwithTeamSeeder'); $this-›user = User :: first); $this-›team = Team:: first() ; } function test_a_user_can_create_a_webhook() { // Act //
种子器的另一个优势是可以创建独立的种子器来匹配特定的场景。David 给出了以下示例:
-
UserWithValidApiKey
-
TeamWithExpiredBillingPlan
-
OrganizationOverUsageLimit
-
CreatorHasntFinishedSetup
-
CustomerWithNovaLicense
这使你可以为复杂的测试设置创建特定种子器,非常适合测试复杂的边缘情况。
他提到的最后一个技巧是,你甚至不必将这些种子器与其他种子器放在一起。在你的 `composer.json` 文件中,你可以从其他地方自动加载它们,比如你的测试目录。
"autoload-dev": { "psr-4": { "Tests\\": "tests/", "Tests\\Seeders\\": "tests/seeders" }},
当然,和所有编程事物一样,这只是用数据进行测试的一种方法。我听说过其他人创建包含所有边缘情况以及大量接近真实世界数据的完整种子器。然后,只有在添加新迁移时才刷新数据库。
如果你厌倦了在测试中编写大量工厂代码,不妨尝试一下这个方法。你可能会喜欢它。