如何在 Laravel 5 中测试表单请求规则



我创建了一个表单请求类并定义了一堆规则。现在我想测试这些规则,看看行为是否符合我们的期望。

我怎样才能写一个测试来完成它?

提前感谢您的回答!

更新:更准确地说,我想编写一个单元测试,例如检查格式不正确的电子邮件是否通过验证。问题是我不知道如何创建一个带有虚假输入的请求的新实例。

接受的答案同时测试授权和验证。如果要单独测试这些功能,则可以执行以下操作:

测试rules()

$attributes = ['aa' => 'asd'];
$request = new MyRequest();
$rules = $request->rules();
$validator = Validator::make($attributes, $rules);
$fails = $validator->fails();
$this->assertEquals(false, $fails);

测试authorize()

$user = factory(User::class)->create();
$this->actingAs($user);
$request = new MyRequest();
$request->setContainer($this->app);
$attributes = ['aa' => 'asd'];
$request->initialize([], $attributes);
$this->app->instance('request', $request);
$authorized = $request->authorize();
$this->assertEquals(true, $authorized);

您应该在基类中创建一些帮助程序方法来保持测试干燥。

例如,您需要在控制器函数中包含表单请求类

public function store(MyRequest $request)

现在创建 HTML 表单并尝试用不同的值填充它。如果验证失败,那么您将在会话中收到消息,如果验证成功,则进入控制器功能。

当单元测试时,调用 url 并将用于测试的值添加为数组。 拉拉维尔文档说它可以完成

$response = $this->call($method, $uri, $parameters, $cookies, $files, $server, $content);

下面是测试验证的完整示例:

use AppHttpRequestsPostRequest;
use IlluminateRoutingRedirector;
use IlluminateValidationValidationException;
class PostRequestTest extends TestCase
{
    protected function newTestRequest($data = [])
    {
        $request = new PostRequest();
        $request->initialize($data);
        return $request
            ->setContainer($this->app)
            ->setRedirector($this->app->make(Redirector::class));
    }
    public function testValidationFailsWhenEmptyTitleIsGiven()
    {
        $this->expectException(ValidationException::class);
        $this->newTestRequest(['title' => ''])->validateWhenResolved();
    }
}

最新更新