首页 > 解决方案 > 使用依赖注入和自定义请求测试 Laravel API 资源

问题描述

从测试中调用时,类型提示的路由参数不会实例化。

我有一个 Laravel API 资源Route::apiResource('users', 'Api\UserController');

这是我在控制器中的更新方法:

public function update(UpdateUserRequest $request, User $user)
{
    //
}

在 UpdateUserRequest 内部:

public function rules()
{
    dd($this->route("user"));
}

如果我从 Postman 调用此端点,我会取回完整的user对象。但是,如果我从测试中调用它:

    $response = $this->actingAs($this->user)->
        json('POST', '/api/users/'.$this->user->id, [
            '_method' => 'PUT',
            'data' => [
                // ...
            ]
        ]);

我只得到字符串“1”,而不是实例化的用户对象。

标签: laraveldependency-injectionphpunitlaravel-5.2inversion-of-control

解决方案


这可能是\Illuminate\Foundation\Testing\WithoutMiddleware由您的测试用例使用的特征引起的。

对于后代,如果有人遇到这种情况,路由模型绑定由\Illuminate\Routing\MiddlewareSubstituteBindings中间件执行。因此,该WithoutMiddleware特征阻止它运行。

基本的 Laravel 测试用例提供了一种未记录的withoutMiddleware()方法/Illuminate/Foundation/Testing/WithoutMiddleware,您可以通过它来解决这个问题,但是值得注意的是,Laravel 的首席开发人员 Taylor Otwell建议尽可能使用所有激活的中间件进行测试。


推荐阅读