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

kan*_*312 10 forms testing unit-testing request laravel

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

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

非常感谢你的答案!

更新:更确切地说,我想编写一个单元测试,检查例如格式错误的电子邮件是否通过验证.问题是我不知道如何用假输入创建一个新的Request实例.

Mar*_*dis 19

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

测试rules():

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

测试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);
Run Code Online (Sandbox Code Playgroud)

您应该在基类中创建一些辅助方法以保持测试DRY.


Mar*_*ala 2

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

public function store(MyRequest $request)
Run Code Online (Sandbox Code Playgroud)

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

当单元测试时,调用 url 并将测试值添加为数组。Laravel 文档说可以这样做

$response = $this->call($method, $uri, $parameters, $cookies, $files, $server, $content);
Run Code Online (Sandbox Code Playgroud)

  • 这似乎有点做作。难道您不应该只关注 Request 对象而不依赖于 URI、cookie 等吗? (8认同)