Laravel包测试与控制器模型数据不一致致404问题求助
问题原因及解决方案
1. 路由参数配置错误
你的第二个嵌套路由存在参数名称匹配错误:
Route::apiResource('employees.addresses', Controllers\AddressController::class)->parameter('companies', 'entity');
这里parameter方法的第一个参数应该是父资源名称employees,而非companies。错误的参数名会导致Laravel无法正确解析entity参数,控制器中无法获取到正确的模型ID,最终因查询不到数据返回404。
修正后的路由:
Route::apiResource('employees.addresses', Controllers\AddressController::class)->parameter('employees', 'entity');
2. 测试请求路径与参数匹配检查
确认测试用例中的请求地址参数是否正确。比如访问企业地址列表时,请求路径应使用/api/companies/{entity}/addresses,其中{entity}替换为实际的企业ID;同理员工地址列表对应/api/employees/{entity}/addresses。若测试中误用了错误的参数占位符或ID,也会导致控制器查询无结果。
3. ServiceProvider绑定逻辑验证
检查ServiceProvider中基于路由名称的模型绑定逻辑是否准确。示例正确逻辑如下:
use Illuminate\Support\Facades\Route; use Illuminate\Support\Str; // 服务提供者中的绑定代码 if (Str::startsWith(Route::currentRouteName(), 'companies.addresses')) { $this->app->bind(Entity::class, Company::class); } elseif (Str::startsWith(Route::currentRouteName(), 'employees.addresses')) { $this->app->bind(Entity::class, Employee::class); }
若路由名称判断逻辑错误,会导致绑定到错误的模型,比如访问企业地址却绑定到员工模型,自然查询不到对应数据。
4. 测试数据关联问题
确保测试中创建的Company/Employee已关联Address数据,且数据创建在请求之前。例如使用工厂创建关联数据:
public function test_should_able_to_retrieve_all_addresses() { // 先创建带关联地址的企业 $company = Company::factory()->hasAddresses(3)->create(); // 再发起请求 $response = $this->get("/api/companies/{$company->id}/addresses"); $response->assertStatus(200); // 其他断言逻辑 }
若数据创建在请求之后,控制器查询时数据尚未存在,也会返回404。
内容的提问来源于stack exchange,提问作者Fery W
相关产品推荐
相关产品推荐

