Laravel 为未经身份验证的用户测试 assertRedirect

Laravel Testing assertRedirect for unauthenticated user

我写了很多次,但我的问题还没有解决。

我想在 Laravel 上使用 PHPUnit 创建一个测试,我的 class 具有如下所述的功能:

public function test_not_connected_user_can_not_create_new_task() {
            
    $this->withoutExceptionHandling();

    //Given we have a task object
    $task = Task::factory()->make();

    // When unauthenticated user submits post request to create task endpoint
    // He should be redirected to login page
    $this->post('/tasks/store',$task->toArray())
        ->assertRedirect(route('login'));
}

这是我的路线:

Route::post('/tasks/store', [App\Http\Controllers\TaskController::class, 'store'])
    ->name('store');

我的控制器功能:

public function __construct() {
    $this->middleware('auth')->except(['index','show']);
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request) {
    $task = Task::create([
        'title' => $request->get('title'),
        'description' => $request->get('description'),
        'user_id' => Auth::id()
    ]);

    return redirect()->route('show', [$task->id]);
}

我们这里有一个middleware来管理身份验证。

当我运行测试时:

vendor/bin/phpunit --filter test_connected_user_can_create_new_task

我收到这个错误:

  1. Tests\Feature\TasksTest::test_not_connected_user_can_not_create_new_task Illuminate\Auth\AuthenticationException: Unauthenticated.

它指向这一行:

$this->post('/tasks/store', $task->toArray())

预期的行为是它应该重定向到登录,但这里测试失败,我不明白为什么。

谢谢

这个问题非常容易解决。你有 $this->withoutExceptionHandling(); 并且这实际上是在抛出错误,你想要的是抓住它并让一切继续。为此,请删除该行代码,您的测试将正常运行。