Laravel 5 PHPUnit环境中的Laravel自定义表单请求

Laravel 5 PHPUnit环境中的Laravel自定义表单请求,laravel-5,phpunit,laravel-5.8,laravel-5.7,Laravel 5,Phpunit,Laravel 5.8,Laravel 5.7,好吧,我已经试着寻找了一段时间的解决方案,来看看这是怎么发生的,为什么会发生 在生产环境中,这段代码可以正常工作 public function store(Add $request) { $data = $request->validated(); //.... some other stuff } Add是一个扩展illumb\Foundation\Http\FormRequest的类,它只有一些规则(我已经检查过了,不会影响错误,这是未发布的原因)

好吧,我已经试着寻找了一段时间的解决方案,来看看这是怎么发生的,为什么会发生

在生产环境中,这段代码可以正常工作

public function store(Add $request) {
        $data = $request->validated();
        //....  some other stuff
}
Add
是一个扩展
illumb\Foundation\Http\FormRequest
的类,它只有一些规则(我已经检查过了,不会影响错误,这是未发布的原因)

在我的测试模式中,我有几个场景,主要是接受测试,以确保根据不同的数据输入创建(或不创建)所有内容。它们进行调用,例如
$this->call($uri,$body,$headers)
,它们按照预期工作,模拟生产环境

但是,我正在尝试编写一个特定于控制器的测试,它不断给我这个错误:

$userController = new UserController();
$request = Add::create('/test', 'POST', $body);
$userController->store($request);
这将输出一个错误:

 Error: Call to a member function validated() on null
 vendor/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php:188
我试着输出
dd($request->validated())返回,但这就是它崩溃的地方

  • 解决办法是什么
  • 为什么会这样

  • 创建请求的新实例时,有些属性设置为
    null
    ,您必须自己填充
    容器
    重定向器
    验证器
    ,然后才能在控制器中正确使用请求

    像这样的方法应该会奏效:

    $userController = new UserController();
    
    // create the request and set the container and redirector
    $request = Add::create('/test', 'POST', $body)
        ->setContainer($this->app)
        ->setRedirector($this->app['redirect']);
    
    // resolve the validator
    $request->validateResolved();
    
    $userController->store($request);
    

    $this->call($uri,$body,$headers)
    第二个参数是
    $body
    ,但是您在
    Add::create(“/test”,“POST”,“$body”)中传递了表单的方法。也许这就是问题所在?$this->call是一个用http调用URI的laravel testcase函数,Add::create是FormRequest的一个派生类,代表http请求的主体,它们是不同的东西