PHPUnit 测试找不到端点 URL

问题描述

我遇到了与 many other similar questions 相同的问题,但没有一个解决方案有效。

我有一个非常简单的测试用例:

class ExampleTest extends TestCase
{
    public function test_find_english()
    {
        $this->withoutExceptionHandling();

        $response = $this->get("api/find?id=1&language=eng");

        $response->assertOk();
    }
}

如果我在浏览器或 Postman 中访问端点,我会得到预期的结果,但如果我运行测试,我会得到:

PHPUnit 9.5.2 by Sebastian Bergmann and contributors.

Symfony\Component\HttpKernel\Exception\NotFoundHttpException : GET http://localhost/api/find

我试过了:

  • 指定带有或不带有前导 / 的 URL。
  • 有或没有api/
  • 完整指定网址,包括 http:// 部分。
  • 指定在我的浏览器中有效的 URL,以及 http://localhosthttp://127.0.0.1,带和不带 :8000

我也在我的 .env 和 .env.testing 文件以及 PHPunit.xml 文件中尝试了上面的内容,注意到出现在异常中的 URL 不会反映任何变化,除非我把它放在 get 中() 方法即使我在每次更改后都运行了 PHP artisan config:cachePHP artisan cache:clear

这是我的 PHPunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<PHPunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/PHPunit/PHPunit/PHPunit.xsd"
         bootstrap="vendor/autoload.PHP"
         colors="true"
         processIsolation="true"
>
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.PHP">./tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.PHP">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <coverage processUncoveredFiles="true">
        <include>
            <directory suffix=".PHP">./app</directory>
        </include>
    </coverage>
    <PHP>
        <server name="APP_ENV" value="testing"/>
<!--        <server name="BCRYPT_ROUNDS" value="4"/>-->
<!--        <server name="CACHE_DRIVER" value="array"/>-->
        <!-- <server name="DB_CONNECTION" value="sqlite"/> -->
        <!-- <server name="DB_DATABASE" value=":memory:"/> -->
<!--        <server name="MAIL_MAILER" value="array"/>-->
<!--        <server name="QUEUE_CONNECTION" value="sync"/>-->
<!--        <server name="SESSION_DRIVER" value="array"/>-->
<!--        <server name="TELEScopE_ENABLED" value="false"/>-->
    </PHP>
</PHPunit>

还有我的 .env.testing:

APP_NAME=MyApp
APP_ENV=testing
APP_KEY=# redacted
APP_DEBUG=true
APP_URL=http://localhost

.env 除了 APP_ENV=local 之外是相同的。在我添加 .env.testing 之前问题就已经存在了。

我在 Vagrant 实例 (Laravel Homestead) 上运行它。

解决方法

我设法找到了问题所在。我没有提到我正在通过 PHP Storm 运行测试,结果证明这是一个致命的细节:我以为我已经正确配置了我的解释器,因为它可以正常工作,但实际上我正在使用其他 Laravel 项目的设置我在同一个实例上。

如果您最终来到这里并使用 IDE 来运行测试,请确保您的解释器适用于项目。我的指向的是不同项目的配置文件,所以它当然无法工作。