【发布时间】:2020-12-28 18:30:52
【问题描述】:
我正在为 Laravel 中构建的 API 编写单元测试。我有一个特定于运行测试的数据库实例,并配置了 phpunit.xml 以告诉 Laravel 在测试期间使用该数据库。
但是,我的问题是当涉及到对路由执行 HTTP 请求的测试时:
$response = $this->json('POST', route('api.login'), [
'email' => 'martin@example.com',
'password' => 'really.secure.password',
]);
上述请求通过我的本地网络,从应用程序的角度来看,这只是另一个请求,它不知道这是 PHPUnit 调用,因此在我的主数据库(不是测试数据库)中创建了身份验证令牌.
现在这感觉像是我正在做的一个非常常见的场景,所以我希望我只是错过了所有文档和教程中的一些小技巧。
一种感觉有点老套的解决方案是添加一些中间件,该中间件检测请求的user-agent 标头是否设置为“PHPUnit”,并通过中间件以某种方式更改环境和数据库值。这感觉有点脏,所以我不愿意在没有先询问 SO 社区的情况下这样做。
你能推荐一种现有的技术或更优雅的方法吗?
【问题讨论】:
-
如果您的应用程序知道请求是否来自 PHPUnit 无关紧要,如果您的 phpunit.xml 设置正确,它将覆盖
DB_CONNECTION并且它只能写入测试数据库,所以确保实际使用了 phpunit.xml。你是如何运行你的测试的?安慰? phpstorm? -
@Remul 我正在通过 SSH 连接到我的 Homestead 盒子并运行
artisan test。我已经使用 dd() 来确认我的phpunit.xml中的 env 值正在被使用并且它们在 PHPUnit 中,但是由请求触发的控制器代码仍然使用正常的 .env 值。 -
你在单元测试中使用
createApplication()吗? -
@user8555937 没有。但我刚刚在 PHPUnit 代码中查找了它。我应该尝试调用它然后运行
$this->app->json()而不是$this->json()? -
@user8555937 好的,我刚刚尝试在我的测试的 setUp() 方法中调用
$this->createApplication();并得到完全相同的结果。在主数据库中创建的令牌。