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请求的主体,它们是不同的东西