首页 > 解决方案 > Laravel 8:尝试通过 JSON Get Testing 测试控制器方法,但找不到路由

问题描述

我收到此错误:

预期状态码 200 但收到 404。未能断言 200 与 404 相同。

当我尝试从我的单元测试中调用它时:

<?php

namespace Tests\Unit;

use App\Models\Project;
use Tests\TestCase;

class ExampleTest extends TestCase
{

    public function testTakePlace()
    {
        $project = Project::factory()->make();

        $response = $this->getJson('controllerUserProject_takePlace', [
            'project_id' => $project->id,
        ]);

        $response
            ->assertStatus(200)
            ->assertJsonPath([
                'project.status' => Project::STATES['TO_BE_REPLIED'],
            ]);
    }
}

但是,controllerUserProject_takePlace我给路线起的名字是正确的。确实,这里是/routing/web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TestConnections;

use App\Http\Controllers\ControllerUserProject;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/controllerUserProject_takePlace/projects/{project_id}', [ControllerUserProject::class, 'takePlace'])->name('controllerUserProject_takePlace');

控制器ControllerUserProject已正确定义:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ControllerUserProject extends Controller
{
    public function takePlace(Request $request, $project_id)
    {
        return [
            'project_status' => Project::STATES['TO_BE_REPLIED']
        ];
    }
}

你知道为什么使用路由返回404(未找到)吗?

标签: laravelphpunitlaravel-routing

解决方案


您的路由 url'/controllerUserProject_takePlace/projects/{project_id}'在您正在使用的测试中,'controllerUserProject_takePlace'因此出现 404 错误。

此外,其中的第二个参数getJson()是数组 $headers,因此当您传递['project_id' => $project->id]它时,它会成为作为 $headers 的第二个参数。

您需要提供完整的网址getJson('/controllerUserProject_takePlace/projects/' . $project->id);

或者

由于您已经命名了您的路线,您可以route()getJson(route('controllerUserProject_takePlace', $project->id));

更改测试中的 url

<?php

namespace Tests\Unit;

use App\Models\Project;
use Tests\TestCase;

class ExampleTest extends TestCase
{

    public function testTakePlace()
    {
        $project = Project::factory()->make();

       // $response = $this->getJson('/controllerUserProject_takePlace/projects/' . $project->id);

        //Try using named route

        $response = $this->getJson(route('controllerUserProject_takePlace', $project->id));

        $response
            ->assertStatus(200)
            ->assertJsonPath([
                'project.status' => Project::STATES['TO_BE_REPLIED'],
            ]);
    }
}

推荐阅读