Laravel 路由 returns 302 而不是 404 响应仅在 phpunit 测试期间
Laravel route returns 302 instead of 404 response only during phpunit test
在 PHPUnit 测试期间,调用应该 return 一个 404
错误,但它 return 是一个 302
重定向。
使用 spatie permissions 授予用户权限。
测试:
use RefreshDatabase;
public User $admin;
public function setUp(): void
{
parent::setUp();
$permission = Permission::firstOrCreate( [ 'name' => 'activities.delete' ] );
$role = Role::firstOrCreate( [ 'name' => 'Admin' ] );
$role->givePermissionTo( $permission );
$this->admin = User::factory()->create();
$this->admin->assignRole( 'Admin' );
$this->app->make( PermissionRegistrar::class )->registerPermissions();
}
public function test_as_a_user_i_can_not_delete_activities_that_do_not_exist(): void
{
Auth::login( $this->admin );
$this->assertAuthenticatedAs( $this->admin );
$response = $this->actingAs( $this->admin )
->delete( route( 'activities.destroy', 234234 ) );
$response->assertNotFound();
}
路线:
<?php
use Illuminate\Support\Facades\Route;
Route::group( [ 'middleware' => 'auth' ], function()
{
Route::group( [ 'prefix' => 'dashboard' ], function()
{
Route::resource( 'activities', \App\Http\Controllers\ActivityController::class )->except( [ 'show' ] );
});
});
删除函数:
public function destroy( Activity $activity ): RedirectResponse
{
if( auth()->user()->customer )
{
abort( 403 );
}
$deleted = $activity->delete();
return redirect()->route( 'activities.index' )->with( [
'message' => 'Activity '.( $deleted ? 'deleted' : 'not deleted' ),
'success' => $deleted,
] );
}
在开发中删除不存在的 activity 它按预期工作,return 出现 404 错误。然而,在测试期间,它 return 是一个 302 重定向。
还注意到,在测试期间删除现有 activity 时 dd($activity)
return 是一个空白模型,而不是已解析的 $activity
模型。在开发过程中,解析的 $activity
再次按预期显示。
public function destroy( Activity $activity ): RedirectResponse
{
if( auth()->user()->customer )
{
abort( 403 );
}
dd($activity);
$deleted = $activity->delete();
return redirect()->route( 'activities.index' )->with( [
'message' => 'Activity '.( $deleted ? 'deleted' : 'not deleted' ),
'success' => $deleted,
] );
}
显然 \Illuminate\Routing\Middleware\SubstituteBindings::class
中间件在 $middlewareGroups
web
数组中丢失 App\Http\Kernel.php
。
https://laravel.com/docs/8.x/urls#url-defaults-middleware-priority
在 PHPUnit 测试期间,调用应该 return 一个 404
错误,但它 return 是一个 302
重定向。
使用 spatie permissions 授予用户权限。
测试:
use RefreshDatabase;
public User $admin;
public function setUp(): void
{
parent::setUp();
$permission = Permission::firstOrCreate( [ 'name' => 'activities.delete' ] );
$role = Role::firstOrCreate( [ 'name' => 'Admin' ] );
$role->givePermissionTo( $permission );
$this->admin = User::factory()->create();
$this->admin->assignRole( 'Admin' );
$this->app->make( PermissionRegistrar::class )->registerPermissions();
}
public function test_as_a_user_i_can_not_delete_activities_that_do_not_exist(): void
{
Auth::login( $this->admin );
$this->assertAuthenticatedAs( $this->admin );
$response = $this->actingAs( $this->admin )
->delete( route( 'activities.destroy', 234234 ) );
$response->assertNotFound();
}
路线:
<?php
use Illuminate\Support\Facades\Route;
Route::group( [ 'middleware' => 'auth' ], function()
{
Route::group( [ 'prefix' => 'dashboard' ], function()
{
Route::resource( 'activities', \App\Http\Controllers\ActivityController::class )->except( [ 'show' ] );
});
});
删除函数:
public function destroy( Activity $activity ): RedirectResponse
{
if( auth()->user()->customer )
{
abort( 403 );
}
$deleted = $activity->delete();
return redirect()->route( 'activities.index' )->with( [
'message' => 'Activity '.( $deleted ? 'deleted' : 'not deleted' ),
'success' => $deleted,
] );
}
在开发中删除不存在的 activity 它按预期工作,return 出现 404 错误。然而,在测试期间,它 return 是一个 302 重定向。
还注意到,在测试期间删除现有 activity 时 dd($activity)
return 是一个空白模型,而不是已解析的 $activity
模型。在开发过程中,解析的 $activity
再次按预期显示。
public function destroy( Activity $activity ): RedirectResponse
{
if( auth()->user()->customer )
{
abort( 403 );
}
dd($activity);
$deleted = $activity->delete();
return redirect()->route( 'activities.index' )->with( [
'message' => 'Activity '.( $deleted ? 'deleted' : 'not deleted' ),
'success' => $deleted,
] );
}
显然 \Illuminate\Routing\Middleware\SubstituteBindings::class
中间件在 $middlewareGroups
web
数组中丢失 App\Http\Kernel.php
。
https://laravel.com/docs/8.x/urls#url-defaults-middleware-priority