Laravel中PHPUnit环境下的自定义FormRequest

4

好的,我已经尝试搜索了一段时间,寻找如何和为什么会出现这种情况的解决方案,以下是解释。

在生产环境中,这段代码的运行状态非常良好。

public function store(Add $request) {
        $data = $request->validated();
        //....  some other stuff
}

Add 是一个继承 Illuminate\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());的返回结果,但程序崩溃了。

  1. 该怎么解决?
  2. 为什么会出现这种情况?

$this->call($uri, $body, $headers)中的第二个参数是$body,但您在Add::create('/test', 'POST', $body);中传递了表单的方法。也许这就是问题所在? - Saiyan Prince
$this->call 是 Laravel 测试用例中的一个函数,用于通过 HTTP 调用 URI。Add::create 是 FormRequest 的一个派生类,表示 HTTP 请求的主体部分。它们是不同的东西。 - abr
1个回答

0

创建请求的新实例时,有一些属性设置为null,您需要在控制器中正确使用请求之前自己填充containerredirectorvalidator

可以尝试以下方法:

$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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接