Laravel phpunit 返回 404
Posted
技术标签:
【中文标题】Laravel phpunit 返回 404【英文标题】:Laravel phpunit returns 404 【发布时间】:2018-05-03 01:22:33 【问题描述】:我是 Laravel 的新手。使用 Homestead 的本地开发环境 尝试运行简单的测试
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class UserTest extends TestCase
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
$response = $this->get('/');
$response->assertStatus(200);
路由/web.php:
Route::get('/', function ()
return view('main');
);
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
运行 phpunit 返回 404 错误
vagrant@homestead:~/code/laravel$ phpunit PHPUnit 6.4.3 by Sebastian 伯格曼和贡献者。
.F. 3 / 3 (100%)
时间:1.07 秒,内存:10.00MB
有 1 次失败:
1) Tests\Feature\UserTest::testBasicTest 预期状态码 200 但 收到 404。断言 false 为 true 失败。
/home/vagrant/code/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:78 /home/vagrant/code/laravel/tests/Feature/UserTest.php:25
我已经尝试用这些方法修复它
1。 Laravel phpunit always 404 更新TestCase.php
protected $baseUrl = 'http://localhost'
change with
protected $baseUrl = 'http://laravel.local'
2。 https://github.com/dingo/api/issues/540 和旁边 https://github.com/dingo/api/issues/571
use Illuminate\Foundation\Testing\WithoutMiddleware;
class BankTest extends TestCase
use WithoutMiddleware;
将 .env 中的 APP_URL 更改为
APP_URL=laravel.local
这些都没有帮助
'laravel.local' 在浏览器中运行良好
请帮我解决它
【问题讨论】:
你能发布你的路线文件吗? @FatBoyXPC,添加了提问路径 这是哪个版本的 Laravel? @FatBoyXPC,5.5.19 你试过把http://放在前面还是把url放在APP_URL里?我试图在没有 http:// 的情况下运行我的测试,但它们失败了。我的 TestCase 中根本没有 $baseUrl,仅供参考。 【参考方案1】:我在浏览器中使用以下 URL 运行我的应用程序。 http://localhost/app/public/
具有以下行的默认单元测试失败。它得到 404 响应而不是 200。
$response = $this->get('/');
$response->assertStatus(200);
在阅读了上面的 cmets 后,我将 .env 文件中的 APP_URL 更改如下。
APP_URL=http://localhost
但我仍然收到 404 错误。经过一些尝试和错误,我发现我需要清除配置缓存。
php artisan config:cache
这成功了,我的测试开始工作了!!
【讨论】:
【参考方案2】:我遇到了同样的问题,如果我用 php artisan serve 运行 laravel,它必须是:
APP_URL=http://127.0.0.1:8000/
APP_URL
必须是网站的 URL。
该网站正在运行,但我没有正确设置该常量,并且 PHPUnit 一直在说 404。
更改配置后不要忘记清除缓存
php artisan config:cache
【讨论】:
您可能还需要运行“php artisan config:cache”【参考方案3】:您是否尝试过在您的phpunit.xml
文件中将process isolation
设置为true
?如果我们没有进程隔离,我们的功能测试就会失败,到处都是 404 错误:
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="true"
stopOnFailure="false">
【讨论】:
我遇到了同样的问题,并且仍在努力全面了解原因(因为我有其他非常相似的测试可以正常工作)。如果您只想在几个测试上运行 processIsolation,您可以在测试上方的文档块注释中添加它@runInSeparateProcess
我第一次测试没问题,其他的都是 404。经过1小时的搜索,我找到了你的答案,我可以修复它。谢谢:)【参考方案4】:
对于遇到此问题的任何人,请使用 APP_URL=http://localhost
,如果您使用 vagrant 我不确定其他环境是否会发生这种情况,仍在调查中。
【讨论】:
这行得通!不知道为什么。我创建了 .env.testing 并设置了APP_URL=http://localhost
甚至 .env 是 APP_URL=http://localhost/app/public
。【参考方案5】:
Laravel 测试运行并期望环境变量。他们期望像ENV_URL
、ENV_KEY
、...这样的变量取决于您的测试用例。
重要的是 ENV_URL
变量设置为 http://localhost
忽略您的 laravel/服务器设置。测试在这里的工作方式不同。
在phpunit.xml
中,<server name="APP_ENV" value="testing"/>
行指定要使用的测试文件。 value="testing"
期望 a 使用 .env.testing
文件,如果它存在并回退到 .env
。
您可以从这里开始使用两种方法:
方法 A - 使用 .env.testing
:
-
创建
.env
的副本并将其命名为.env.testing
。
确认phpunit.xml
包含.env.testing
文件,如关注<server name="APP_ENV" value="testing"/>
重要提示 编辑 .env.testing
以使用 APP_URL=http://localhost
作为其 URL。您通常在哪个 URL 下为您的应用程序提供服务并不重要。
编辑其他值以反映您的测试环境
使用php artisan cache:clear
删除缓存
方法 B - phpunit.xml 中的 ENV 值:
您可以对 phpunit.xml 中的所有 ENV 值进行硬编码,如下所示
...
<php>
<server name="APP_URL" value="http://localhost"/>
<server name="APP_KEY" value="base64:e8+BZAzKrSR/LprdHQ2TfMaw+DOTWYmgpkFkEJHV+zw="/>
<server name="DB_CONNECTION" value="mysql"/>
<server name="DB_HOST" value="127.0.0.1"/>
<!-- More ENV values -->
...
<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
文件并覆盖phpunit.xml
内的APP_URL
。
为此,不应该存在 .env.testing
文件或删除 <server name="APP_ENV" value="testing"/>
(如果存在)。
...
<php>
<server name="APP_ENV" value="testing"/>
<!-- IMPORTANT - Overwrite the APP_URL -->
<server name="APP_URL" value="http://localhost"/>
<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>
【讨论】:
【参考方案6】:解决方法是简单的使用返回的url进行测试
php artisan serve
作为基本 url 然后运行测试
例如:
$response = $this->post('http://127.0.0.1:8001/api/register', [
'email' => '',
'phone' => '',
'password' => '',
'c_password' => '',
'role_id' => '',
]);
$response->assertStatus(401);
【讨论】:
【参考方案7】:正如@TooCooL 提到的,即使您的项目可能是APP_URL=http://localhost/myproject
,也可以设置APP_URL=http://localhost
。
更好的是创建另一个.env
,它应该被称为env.testing
,并且可以更改APP_URL甚至另一个数据库,仅用于测试目的等等。
Phpunit 将在该文件中查找配置 .env.testing
尽管即使在我的灯堆栈上的虚拟主机名上设置了 APP_URL,phpunit 也能正常工作。
同时检查您的 /etc/hosts 文件。
【讨论】:
【参考方案8】:仅适用于 Laravel 8 开发人员。
在 get 方法中使用完整的 url
$response = $this->get('http://127.0.0.1:8000');
【讨论】:
以上是关于Laravel phpunit 返回 404的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 路由仅在 phpunit 测试期间返回 302 而不是 404 响应
Laravel 5.4 上的示例 PHPUnit 测试失败并显示 404
PHPUnit:预期状态码 200 但使用 Laravel 收到 419
在运行 laravel phpunit testcase 时,我在 Model.php 第 1249 行收到错误“调用 null 上的成员函数 connection()”