使用依赖注入和自定义请求测试LaravelAPI资源

使用依赖注入和自定义请求测试LaravelAPI资源,laravel,dependency-injection,phpunit,laravel-5.2,inversion-of-control,Laravel,Dependency Injection,Phpunit,Laravel 5.2,Inversion Of Control,从测试调用时,类型提示路由参数不会实例化 我有一个laravelapi资源Route::apirource('users','API\UserController') 以下是我在控制器中的更新方法: public function update(UpdateUserRequest $request, User $user) { // } 在UpdateUserRequest中: public function rules() { dd($this->route("user

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

我有一个laravelapi资源
Route::apirource('users','API\UserController')

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

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

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

public function __construct(User $user)
{
    $this->user = $user;
}
如果我从Postman调用此端点,我将返回完整的
user
对象。但是,如果我从测试中调用它:

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

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

好吧,有一件事是有效的,我不知道这是正确的还是“Laravel”的方法,就是在自定义请求构造函数中强制实例化模型,并在测试中绑定实例:

在UpdateUserRequest中:

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

public function __construct(User $user)
{
    $this->user = $user;
}
在测试中:

$this->user = factory(\App\Models\User::class)->create();
$this->app->instance(\App\Models\User::class, $this->user);

这可能是由于测试用例使用了
\lightlight\Foundation\Testing\without middleware
特性造成的

对于后代来说,如果有人遇到这种情况,路由模型绑定将由
\illumb\Routing\MiddlewareSubstituteBindings
中间件执行。因此,没有中间件的
特性会阻止它运行

基本Laravel测试用例通过
/illighted/Foundation/Testing/without middleware
提供了一个未记录的
without middleware()
方法,您可以使用该方法来解决这个问题,但是可能值得注意的是,Laravel的首席开发人员Taylor Otwell在所有中间件都处于活动状态时进行测试