【问题标题】:PHPUnit test HTTP requests to Laravel API with separate databasePHPUnit 使用单独的数据库测试对 Laravel API 的 HTTP 请求
【发布时间】: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(); 并得到完全相同的结果。在主数据库中创建的令牌。

标签: laravel api rest phpunit


【解决方案1】:

@MartinJoiner 你找到解决这个问题的方法了吗?

虽然这是一个老问题。这是我所做的,无论如何这都不是一个完美的解决方案。所有数据库设置都来自 .env 文件。我有一个单独的 .env.testing 应该仅用于测试。虽然 phpunit 知道环境正在测试,但我在 composer.json 中完成了以下操作以确保测试使用 .env.testing

这意味着当在测试期间进行 api 调用时,本地系统正在使用 .env.testing 并确保测试 DB 用于 HTTP 和 phpunit。

    "scripts": {
        "test": [
            "cp .env.testing .env",
            "vendor/bin/phpunit",
            "cp .env.example .env"
        ],
    }

然后通过composer test 运行测试。

但是我有一点different but related issue。希望大家多多指教。

【讨论】:

  • 我尝试了一个非常相似的事情,我在物理上重写了.env 文件,但这会导致缓存配置和写入错误数据库的各种可怕问题。我的解决方案实际上是 2 倍的:我停止使用 config:cache 作为常用命令,因为它非常粘,所以现在这只是一个部署步骤。我还开始在我的代码中使用Request::create() 来创建一个请求对象,然后将其传递给app()->handle($request) 以获取我的响应,从而避开网络。也许我应该把它写成一个正确的答案(?)
猜你喜欢
  • 2023-03-20
  • 2017-05-07
  • 1970-01-01
  • 2021-07-27
  • 2020-04-10
  • 2015-09-26
  • 2021-04-15
  • 2019-06-10
  • 2020-03-26
相关资源
最近更新 更多