为啥 Laravel 中的 PHPUnit 不能访问存在的路由?

Posted

技术标签:

【中文标题】为啥 Laravel 中的 PHPUnit 不能访问存在的路由?【英文标题】:Why can't PHPUnit in Laravel access a route that exists?为什么 Laravel 中的 PHPUnit 不能访问存在的路由? 【发布时间】:2016-06-16 02:59:37 【问题描述】:

我在运行 phpUnit 测试时遇到了问题,但在我尝试手动测试应用程序时却没有。

我的单元测试包含

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class UserAdminPanelTest extends TestCase

    use DatabaseMigrations;

    /**
     * Tests that the user/company admin panel is showing data and able to save changes.
     *
     * @return void
     */
    public function testUserAdminPanel()
    
        $user = factory(App\User::class)->create();

        $this->actingAs($user)
             ->withSession(['foo' => 'bar'])
             ->visit('/')
             ->click('User')
             ->seePageIs('/user/3')
             ->see('Edit')
             ->click('Edit');   // There's more after this but this is where I get the error
    

我的路线是

Route::group(['middleware' => 'web'], function () 
    Route::auth();

    Route::get('/', function ()    
        return view('welcome');
    );

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

    Route::group(['middleware' => 'auth'], function () 
        Route::resource('user', 'UserController',
            ['except' => ['create', 'store', 'destroy']]);

    );

);

当我尝试运行测试时遇到的错误是

There was 1 failure:

1) UserAdminPanelTest::testUserAdminPanel
A request to [http://localhost/usbsinc/public/user/3/edit] failed. Received status code [404].

C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:178
C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:72
C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:53
C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:706
C:\xampp\htdocs\usbsinc\tests\UserAdminPanelTest.php:27
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:176
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:129

Caused by
exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php:161
Stack trace:
#0 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Routing\Router.php(823): Illuminate\Routing\RouteCollection->match(Object(Illuminate\Http\Request))
#1 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Routing\Router.php(691): Illuminate\Routing\Router->findRoute(Object(Illuminate\Http\Request))
#2 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Routing\Router.php(675): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#3 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(246): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#4 [internal function]: Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\closure(Object(Illuminate\Http\Request))
#5 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#6 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(44): Illuminate\Routing\Pipeline->Illuminate\Routing\closure(Object(Illuminate\Http\Request))
#7 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#8 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array)
#9 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#10 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#11 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\closure(Object(Illuminate\Http\Request))
#12 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#13 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(132): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#14 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(99): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#15 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php(480): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#16 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php(70): Illuminate\Foundation\Testing\TestCase->call('GET', 'http://localhos...', Array, Array, Array)
#17 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php(53): Illuminate\Foundation\Testing\TestCase->makeRequest('GET', 'http://localhos...')
#18 C:\xampp\htdocs\usbsinc\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php(706): Illuminate\Foundation\Testing\TestCase->visit('http://localhos...')
#19 C:\xampp\htdocs\usbsinc\tests\UserAdminPanelTest.php(27): Illuminate\Foundation\Testing\TestCase->click('Edit')
#20 [internal function]: UserAdminPanelTest->testUserAdminPanel()
#21 C:\xampp\htdocs\usbsinc\vendor\phpunit\phpunit\src\Framework\TestCase.php(909): ReflectionMethod->invokeArgs(Object(UserAdminPanelTest), Array)
#22 C:\xampp\htdocs\usbsinc\vendor\phpunit\phpunit\src\Framework\TestCase.php(768): PHPUnit_Framework_TestCase->runTest()
#23 C:\xampp\htdocs\usbsinc\vendor\phpunit\phpunit\src\Framework\TestResult.php(612): PHPUnit_Framework_TestCase->runBare()
#24 C:\xampp\htdocs\usbsinc\vendor\phpunit\phpunit\src\Framework\TestCase.php(724): PHPUnit_Framework_TestResult->run(Object(UserAdminPanelTest))
#25 C:\xampp\htdocs\usbsinc\vendor\phpunit\phpunit\src\Framework\TestSuite.php(747): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#26 C:\xampp\htdocs\usbsinc\vendor\phpunit\phpunit\src\Framework\TestSuite.php(747): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult))
#27 C:\xampp\htdocs\usbsinc\vendor\phpunit\phpunit\src\TextUI\TestRunner.php(440): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult))
#28 C:\xampp\php\pear\PHPUnit\TextUI\Command.php(176): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#29 C:\xampp\php\pear\PHPUnit\TextUI\Command.php(129): PHPUnit_TextUI_Command->run(Array, true)
#30 C:\xampp\php\phpunit(46): PHPUnit_TextUI_Command::main()
#31 main

我挖了又挖,但我无法弄清楚发生了什么,甚至如何这样的事情会发生。关于某些调试代码的任何提示或可能发生的事情?

【问题讨论】:

服务器日志 (XAMPP) 没有显示任何错误,甚至没有显示 PHPUnit 访问(如果它正在从 PHPUnit 记录任何内容,因为还有其他成功的测试正在访问页面)。跨度> 嘿 P.H.P ;) 你有解决这个问题的方法吗?我也遇到过 我刚刚在下面添加了答案。 【参考方案1】:

对于我来说,.env 文件中的APP_URL 值应该以http:// 开头,否则RouteCollection 无法匹配MakesHttpRequest 创建的请求

APP_URL=http://myproject.test => 有效

APP_URL=myproject.test => 不起作用

【讨论】:

【参考方案2】:

问题原来是我使用了Click 方法,该方法将单击锚标记,但我的视图有一个名为“编辑”的html5 button 元素。我将方法切换到Press 并且成功了。

【讨论】:

【参考方案3】:

我遇到了同样的问题并以这种方式解决了它:

转到 /vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php 的第 140 行

通过添加此代码并从命令行运行 phpunit,将函数 match(Request $request) 中的 $request 转储并终止。

dd($request);

现在,检查转储数组的“REQUEST_URI”。

我发现这对我来说是不正确的,我的 app_path 似乎是重复的,这使我回到了问题的根源,即我对 tests/TestCase.php 类所做的修改。

确保 $baseUrl 设置正确:

protected $baseUrl = 'http://localhost';

我在尝试修复我的 .env 文件的问题时更新了此内容,但忘记将其更改回来。如果这能解决您的问题,请告诉我!

【讨论】:

这可能是问题,@Mike,但在我的情况下这不是问题。感谢您的周到意见。我相信它会对遇到此问题的其他人有所帮助。

以上是关于为啥 Laravel 中的 PHPUnit 不能访问存在的路由?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Laravel PHPUnit 内存测试会播种我的主数据库?

phpunit,laravel:当当前类范围没有父级时不能使用“父级”

Laravel5、PHPUnit 和 Date Mutators:不能在数据提供者中使用 mutator

为啥 phpunit 没有得到 phpunit.xml 中指定的正确 APP_ENV?

Laravel - PHPUnit 中的伪造路由

Laravel Homestead 中的 PHPUnit 测试失败