laravel - 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(未找到)吗?
解决方案
您的路由 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'],
]);
}
}
推荐阅读
- node.js - 在ubuntu 18.04上运行node应用时出现问题
- flutter - 没有在 build < flutter < build apk 中显示 build apk 的选项
- python - numpy.where() 还计算未使用的值
- delphi - 使用 ssl 连接时出错。观察到 Eof 违反了协议
- wordpress - 2 个 Wordpress 安装,在一个 URL 上为每个特定区域提供服务
- sql - 将三个表之间的计数(*)相加
- spring-boot - 在Spring boot中,如何将表单动作中的jsp表单输入的值作为参数传递
- python - 权限错误 python jupyterhub。怎么解决?
- javascript - 如何在 div id 上创建 .click() 函数,但 id 在数组中?
- vba - 将范围值随机分配到更大的范围