【问题标题】:Laravel 8 : Trying to test a controller method thanks to JSON Get Testing but the route is not foundLaravel 8:尝试通过 JSON Get Testing 测试控制器方法,但找不到路由
【发布时间】:2021-03-12 14:26:39
【问题描述】:

我收到此错误:

预期状态码 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(未找到)吗?

【问题讨论】:

    标签: laravel phpunit laravel-routing


    【解决方案1】:

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

    getJson() 中的第二个参数也是 $headers 数组,所以当您传递 ['project_id' =&gt; $project-&gt;id] 时,它会成为第二个参数,作为 $headers。

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

    由于您已经为路线命名,您可以在 getJson(route('controllerUserProject_takePlace', $project-&gt;id)); 中使用 route() 助手

    更改测试中的网址

    <?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'],
                ]);
        }
    }
    

    【讨论】:

    • 我还有同样的问题
    • 你能不能尝试访问路由'/controllerUserProject_takePlace/projects/1'(假设你在db中有一个项目记录),看看你是否能够访问。如果您仍然收到 404 错误。尝试php artisan route:clear 清除路由缓存(如果有)。看看这是否有效
    • 你在运行php artisan route:list987654330@时能看到这条路线吗
    • php artisan route:list 确实显示:" | | GET|HEAD | controllerUserProject_takePlace/projects/{project_id} | controllerUserProject_takePlace | App\Http\Controllers\ControllerUserProject@takePlace | web | "
    • getJson() 第二个参数是数组 $headers,所以你需要构建包含 $project->id 的 url。如果您将它作为第二个参数传递给 getJson,那么它将被视为标头而不是路由参数。已更新我的答案以使用没有命名路由的 getJson
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多