【发布时间】:2021-04-04 18:09:36
【问题描述】:
我正在尝试通过 phpunit 测试 Laravel REST API。在测试 REST 调用时,我无法隔离 REST 调用测试。
在 Laravel 中,我了解一些选项,例如使用特征 DatabaseMigrations、DatabaseRefresh、DatabaseTransactions。但我不能使用这些,原因如下:
-
DatabaseMigrations: 应用没有正确的迁移。就算有,那也是相当低效的。 -
DatabaseRefresh:同上。 -
DatabaseTransactions。我看到的问题是对 HTTP API 的调用是一个完全不同的过程。这些不在同一个事务中。因此,HTTP 调用看不到插入数据以设置测试用例的测试。此外,如果数据是通过 HTTP 调用插入的,其他测试也可以看到。
如果不调用 HTTP,我就无法编写单元测试;该应用程序不是以这种方式编写的。整个代码位于 Routes 或 Controller 中,否则不可测试。
【问题讨论】:
-
如果您没有以不符合 sqlite 的方式构建计划的生产数据库 - 那么定义正确的迁移将是一个很好的步骤。然后,您可以使用内存中的 sqlite 进行 DatabaseMigrations 或 RefreshDatabase 测试,测试仍然会很快 - 只是一个想法
-
@Donkarnash 创建整个模式的迁移将非常困难,尽管并非不可能。一旦找到可以自动执行此操作的工具,我将尝试一下,我的意思是获取一个 sql 并将其转换为 Laravel Migration/Seeder。但是,我仍在寻找可能处理事务的解决方案。这也许是阻力最小的路径。
-
你能解释一下为什么API调用是一个完全不同的事务吗?你试过写一个简单的测试用例吗?如果是的话,你能给我们看看代码吗?
-
我认为您的误解是您打算通过网络使用 HTTP 请求调用 API。在 Laravel 中,你有 HTTP 测试,请参阅laravel.com/docs/8.x/http-tests 的文档以获取更多信息。测试的整个想法是您始终使用模拟实例。您还如何防止应用程序触发真实事件或写入您的开发甚至生产数据库而不是测试数据库?