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_URLENV_KEY、...这样的变量取决于您的测试用例。 重要的是 ENV_URL 变量设置为 http://localhost 忽略您的 laravel/服务器设置。测试在这里的工作方式不同。

phpunit.xml 中,&lt;server name="APP_ENV" value="testing"/&gt; 行指定要使用的测试文件。 value="testing" 期望 a 使用 .env.testing 文件,如果它存在并回退到 .env

您可以从这里开始使用两种方法:

方法 A - 使用 .env.testing:

    创建.env 的副本并将其命名为.env.testing。 确认phpunit.xml 包含.env.testing 文件,如关注&lt;server name="APP_ENV" value="testing"/&gt; 重要提示 编辑 .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 文件或删除 &lt;server name="APP_ENV" value="testing"/&gt;(如果存在)。

   ...
    <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 返回 404

Laravel 路由仅在 phpunit 测试期间返回 302 而不是 404 响应

Laravel 5.4 上的示例 PHPUnit 测试失败并显示 404

PHPUnit:预期状态码 200 但使用 Laravel 收到 419

PHPUnit / Lumen 总是返回 404

在运行 laravel phpunit testcase 时,我在 Model.php 第 1249 行收到错误“调用 null 上的成员函数 connection()”