问题描述
我遇到了与 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://localhost
和http://127.0.0.1
,带和不带:8000
。
我也在我的 .env 和 .env.testing 文件以及 PHPunit.xml 文件中尝试了上面的内容,注意到出现在异常中的 URL 不会反映任何变化,除非我把它放在 get 中() 方法即使我在每次更改后都运行了 PHP artisan config:cache
和 PHP 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 来运行测试,请确保您的解释器适用于项目。我的指向的是不同项目的配置文件,所以它当然无法工作。