【发布时间】:2018-05-30 17:17:02
【问题描述】:
我正在尝试为我的表单编写一些测试,以确认验证器在需要时检索到预期的错误。
该表单只有 3 个字段:name、discount 和 expiration,验证器如下所示:
$this->validate($request, [
'name' => 'required',
'discount' => 'required|numeric|between:1,100',
'expiration' => 'required|date_format:d/m/Y',
]);
在提交表单和使用 phpunit 使用以下代码运行测试时都可以正常工作:
/**
* Discount must be numeric check
*/
$response = $this->post(route('offer.create'), [
'name' => $faker->sentence(4),
'discount' => 'asdasd',
'expiration' => $faker->dateTimeBetween('+1 days', '+5 months')
]);
// Check errors returned
$response->assertSessionHasErrors(['discount']);
由于折扣不是数字,它会引发预期的错误,每个人都很高兴。
现在,如果我想添加一条新规则以确保到期时间等于或大于今天,我添加 after:yesterdayrule 留下验证器,例如:
$this->validate($request, [
'name' => 'required',
'discount' => 'required|numeric|between:1,100',
'expiration' => 'required|date_format:d/m/Y|after:yesterday',
]);
提交表单时效果很好。我收到错误消息说折扣不是数字,但是在使用 phpunit 进行测试时,它没有得到预期的错误:
1) Tests\Feature\CreateSpecialOfferTest::testCreateSpecialOffer
Session missing error: expiration
Failed asserting that false is true.
为什么将这个新的验证规则添加到 expiration 会在 discount 中生成错误验证?这是验证器中的错误还是我遗漏了什么?
还有:
1 - 有没有更好的方法来测试表单验证器?
2 - 是否有一个与 assertSessionHasErrors() 相反的断言来检查某个错误是否未被抛出?
【问题讨论】:
-
朋友们,请做好单元测试,毕竟你在这里测试的不仅仅是规则,validationData和withValidator函数也可能在那里。 here is my answer
标签: php forms validation phpunit laravel-5.5