使用依赖注入和自定义请求测试LaravelAPI资源
从测试调用时,类型提示路由参数不会实例化 我有一个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
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在所有中间件都处于活动状态时进行测试