You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.8中如何用正则断言重定向到带整数参数的URL?

解决Laravel 5.8中TDD断言正则匹配重定向URL的问题

我完全懂你的困扰——硬编码/projects/1确实不够灵活,而且assertRedirect()本身并不支持直接传入正则表达式,它只会把参数当作精确的URL字符串去匹配。下面给你两种适配Laravel 5.8的实用解决方案:

方案一:通过获取刚创建的项目ID断言(更可靠)

既然你已经在测试中验证了数据库存在提交的数据,那完全可以先取出刚创建的项目,用它的ID构建正确的重定向URL,这样既不用硬编码,还能保证断言的准确性:

/** @test */
public function a_user_can_create_projects() {
    $this->signIn();
    $this->get('/projects/create')->assertStatus(200);

    $attributes = [
        'title' => $this->faker->sentence,
        'description' => $this->faker->paragraph
    ];

    // 先提交表单,再取出刚创建的项目
    $this->post('/projects', $attributes);
    $project = \App\Project::where($attributes)->first();

    // 用项目ID动态构建URL做断言
    $this->post('/projects', $attributes)->assertRedirect('/projects/' . $project->id);

    $this->assertDatabaseHas('projects', $attributes);
    $this->get('/projects')->assertSee($attributes['title']);
}

方案二:手动提取重定向URL并做正则匹配

如果你确实想用正则验证URL结构,可以先获取响应的重定向地址,再用assertRegExp()完成匹配:

/** @test */
public function a_user_can_create_projects() {
    $this->signIn();
    $this->get('/projects/create')->assertStatus(200);

    $attributes = [
        'title' => $this->faker->sentence,
        'description' => $this->faker->paragraph
    ];

    // 获取POST请求的响应对象
    $response = $this->post('/projects', $attributes);
    // 提取重定向的Location头信息
    $redirectUrl = $response->headers->get('Location');

    // 正则匹配完整URL格式(注意Location返回的是绝对URL,需包含应用域名)
    $this->assertRegExp('/^' . preg_quote(config('app.url'), '/') . '\/projects\/\d+$/', $redirectUrl);

    $this->assertDatabaseHas('projects', $attributes);
    $this->get('/projects')->assertSee($attributes['title']);
}

这里要注意:Laravel测试中响应的Location头返回的是绝对URL(比如http://localhost/projects/2),所以正则里要包含你的应用域名,用config('app.url')可以动态获取,避免硬编码域名。

另外补充一句:assertRedirectPattern()方法是Laravel 6及以后版本才新增的,所以Laravel 5.8没法直接使用这个方法,上面的两种方案更适配你的版本。

内容的提问来源于stack exchange,提问作者Willower

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:25:47