Laravel phpunit返回404

时间:2017-11-19 20:20:56

标签: laravel phpunit

我是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);
    }
}

routes / web.php:

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

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

运行phpunit会返回404错误

  

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

     

.F。 3   / 3(100%)

     

时间:1.07秒,内存:10.00MB

     

有1次失败:

     

1)Tests \ Feature \ UserTest :: testBasicTest预期状态代码200但是   收到404.无法断言false是真的。

     

/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     updateTestCase.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;
  1. 将.env中的APP_URL更改为

    APP_URL=laravel.local
    
  2. 这一切都没有帮助

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

    请帮我修理

8 个答案:

答案 0 :(得分:5)

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

APP_URL=http://127.0.0.1:8000/

APP_URL必须是网站的网址。

该网站正在运行,但我没有正确地保持这种常数,并且PHPUnit一直在说404。

答案 1 :(得分:3)

我正在使用以下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

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

答案 2 :(得分:2)

Laravel 测试运行并期望环境变量。他们期望像 ENV_URLENV_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>

奖励 - 混合方法:

使用主 .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>

答案 3 :(得分:1)

您是否尝试将process isolation设置为true文件中的phpunit.xml?如果我们没有进程隔离,我们的功能测试就会失败,并且会出现404错误:

<phpunit backupGlobals="false"
 backupStaticAttributes="false"
 bootstrap="bootstrap/autoload.php"
 colors="true"
 convertErrorsToExceptions="true"
 convertNoticesToExceptions="true"
 convertWarningsToExceptions="true"
 processIsolation="true"
 stopOnFailure="false">

答案 4 :(得分:1)

对于有此问题的任何人,请使用APP_URL=http://localhost,如果您使用流浪汉,这种情况会发生,我不确定其他环境,仍在调查中。

答案 5 :(得分:0)

正如@TooCooL所述,即使您的项目可能是APP_URL=http://localhost,也可以设置APP_URL=http://localhost/myproject
更好的做法是创建另一个.env,它的名称为env.testing,在那里可以更改APP_URL或什至仅用于测试目的的另一个数据库,等等。
phpunit将在该文件.env.testing中寻找配置
尽管phpunit即使在我的灯泡堆栈上的我的虚拟主机名上设置了APP_URL,也能正常工作。 还要检查您的/ etc / hosts文件。

答案 6 :(得分:0)

解决方案是简单地使用

返回的网址进行测试
php artisan serve

作为基本网址,然后运行测试

例如:

    $response = $this->post('http://127.0.0.1:8001/api/register', [
        'email' => '',
        'phone' => '',
        'password' => '',
        'c_password' => '',
        'role_id' => '',
    ]);

    $response->assertStatus(401);

答案 7 :(得分:0)

仅适用于 Laravel 8 开发人员。

get方法中使用完整的url

 $response = $this->get('http://127.0.0.1:8000');