Laravel PHPUnit返回404

Иль*_*сов 5 phpunit laravel

我是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

route / web.php:

Route::get('/', function () {
    return view('main');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Run Code Online (Sandbox Code Playgroud)

运行phpunit返回404错误

vagrant @ homestead:〜/ code / laravel $ phpunit Sebastian Bergmann和贡献者的PHPUnit 6.4.3。

。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总是404 updateTestCase.php

    protected $baseUrl = 'http://localhost'

change with

    protected $baseUrl = 'http://laravel.local'
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)
  1. 将.env中的APP_URL更改为

    APP_URL=laravel.local
    
    Run Code Online (Sandbox Code Playgroud)

这些都没有帮助

'laravel.local'在浏览器中正常工作

请帮我解决

小智 6

我有同样的问题,如果我用php artisan serve运行laravel,它必须是:

APP_URL=http://127.0.0.1:8000/
Run Code Online (Sandbox Code Playgroud)

APP_URL,必须是完全网站的URL。

该网站正在运行,但是我没有正确地使用该常量,PHPUnit一直在说404。


Tan*_*kom 6

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

  1. 创建 的副本.env并将其命名为.env.testing.
  2. 验证phpunit.xml包含该.env.testing文件,如下所示<server name="APP_ENV" value="testing"/>
  3. 重要事项编辑.env.testing用作APP_URL=http://localhost其 URL。您通常在哪个 URL 下提供应用程序并不重要。
  4. 编辑其他值以反映您的测试环境
  5. 删除缓存使用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>
Run Code Online (Sandbox Code Playgroud)

奖励 - 混合方法:

使用主.env文件并APP_URL覆盖phpunit.xml. 为此,文件不应该存在,或者如果存在则.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>
Run Code Online (Sandbox Code Playgroud)


Too*_*ooL 5

对于遇到此问题的任何人,请使用APP_URL=http://localhost,如果您使用 vagrant ,就会发生这种情况,我不确定其他环境是否如此,仍在调查。


Mih*_*ana 5

我在浏览器中使用以下URL运行我的应用程序。 http:// localhost / app / public /

下一行的默认单元测试失败。它得到404响应而不是200。

$response = $this->get('/'); $response->assertStatus(200);

阅读以上评论后,我如下更改了.env文件中的APP_URL。

APP_URL=http://localhost

但是我仍然遇到404错误。经过一番尝试和错误后,我发现我需要清除配置缓存。

php artisan config:cache

这成功了,我的测试开始了!!