Laravel 9删除供应商测试失败:缺少supplier路由参数求助
问题:Laravel功能测试删除供应商时提示缺少参数
我编写了功能测试验证控制器是否正常工作,但测试持续失败,报错信息如下:
Missing required parameter for [Route: admin/suppliers/destroy] [URI: admin/suppliers/{supplier}] [Missing parameter: supplier]
我已经在路由中传入参数route('admin/suppliers/destroy', $supplier),但仍出现相同错误,请问可能的原因是什么?
我的测试代码:
public function test_if_a_user_can_delete_a_supplier() { //Make fake data, don't persist to database. $supplier = Supplier::factory()->make()->setAppends([])->makeHidden(['created_at', 'updated_at']); //Create an Admin User and assign the Administrator role to this new user $adminUser = factory(AdminUser::class)->create(); $adminUser->roles()->sync(Role::where('name', 'Administrator')->first()); $this->actingAs($adminUser, config('admin-auth.defaults.guard')) ->json( 'DELETE', route('admin/suppliers/destroy', $supplier), $supplier->toArray() ) ->assertStatus(302) ->assertRedirectToRoute('admin/suppliers/index'); $this->assertDatabaseMissing( 'suppliers', $supplier->toArray() ); }
原因分析与解决方案
核心问题:未持久化的模型没有有效主键
你用Supplier::factory()->make()生成的是内存中的模型实例,不会存入数据库,所以这个实例没有自动生成的主键(比如id字段)。Laravel的路由隐式绑定依赖模型的主键值来填充路由参数{supplier},没有主键的话,路由生成时无法提取到所需参数,自然会报“缺少参数”的错误。正确解决方案:持久化模型到数据库
把make()替换成create(),这样模型会被写入数据库并生成主键:$supplier = Supplier::factory()->create()->setAppends([])->makeHidden(['created_at', 'updated_at']);另外,原本用
make()时,assertDatabaseMissing断言毫无意义——因为模型根本没进数据库,断言永远会通过。改成create()后,这个断言才能真正验证删除操作是否生效。额外优化:删除请求无需传模型数据
DELETE请求只需要路由里的供应商ID就能完成删除,不需要把整个模型数组作为请求体传入,所以可以去掉第三个参数:$this->actingAs($adminUser, config('admin-auth.defaults.guard')) ->json('DELETE', route('admin/suppliers/destroy', $supplier)) ->assertStatus(302) ->assertRedirectToRoute('admin/suppliers/index');
内容的提问来源于stack exchange,提问作者Dirk Robbertse
相关产品推荐
相关产品推荐

