【发布时间】:2021-07-02 06:19:27
【问题描述】:
我正在尝试验证 FormRequest 中所需的(可能)空数组。
我使用present 和array 验证规则,因为我希望传递值,但它可能是一个空数组。
问题是我的测试在空字符串(即:'')上失败,告诉我我的请求没有抛出具有该值的预期 ValidationException。
我的测试涵盖了给定字段的以下值:
| input value | expected result | test outcome |
|---|---|---|
null |
error present | passed |
'a string' |
error present | passed |
'' |
error present | failed |
123 |
error present | passed |
123.456 |
error present | passed |
true |
error present | passed |
[] |
error not present | passed |
['a', 'b'] |
error not present | passed |
我如何测试预期的请求参数是否存在,是一个数组并且可能是一个空数组?
更新 #1:我的代码
请求
class TestRequest extends FormRequest
{
public function rules()
{
return [
'array_field' => ['present', 'array'],
];
}
}
测试
public function testTest()
{
$tests = [
[
'value' => null,
'outcome' => 'failure',
'message' => 'Failed asserting that request returned error for when null is passed.',
],
[
'value' => 'string',
'outcome' => 'failure',
'message' => 'Failed asserting that request returned error when non empty string is passed.',
],
[
'value' => '',
'outcome' => 'failure',
'message' => 'Failed asserting that request returned error when empty string is passed.',
],
[
'value' => 123,
'outcome' => 'failure',
'message' => 'Failed asserting that request returned error when integer is passed.',
],
[
'value' => 123.456,
'outcome' => 'failure',
'message' => 'Failed asserting that request returned error when float is passed.',
],
[
'value' => true,
'outcome' => 'failure',
'message' => 'Failed asserting that request returned error when boolean is passed.',
],
[
'value' => [],
'outcome' => 'success',
'message' => 'Failed asserting that request returned no error when empty array is passed.',
],
[
'value' => ['a', 'b'],
'outcome' => 'success',
'message' => 'Failed asserting that request returned no error when filled array is passed.',
],
];
foreach ($tests as $test) {
try {
$request = new TestRequest([
'array_field' => $test['value']
]);
$request
->setContainer(app())
->setRedirector(app(Redirector::class))
->validateResolved();
} catch (ValidationException $e) {
}
if ('failure' == $test['outcome']) {
$this->assertTrue(
isset($e),
'Failed asserting that request throw an exception for invalid ' . json_encode($test['value']) . ' value.'
);
$this->assertArrayHasKey(
'array_field',
$e->errors(),
$test['message']
);
unset($e);
} else {
$this->assertFalse(
isset($e),
$test['message']
);
}
}
}
PhpUnit 输出
更新#2:使用的规则组合
我已经测试过
-
present+array array-
required+array
但这些都没有通过验证。
更新#3:结束
发现 this old question 描述了我的相同情况:使用可用的验证规则似乎无法实现我的目标; this comment 表示更接近的解决方案是使用 ConvertEmptyStringsToNull 将空字符串转换为空值并仅针对 null 值测试验证。
【问题讨论】:
-
请同时发布您的代码以便更好地理解。
-
测试代码很长,我会尽快发布一个较短的版本,但本质上它会迭代一组输入值和预期结果,所以我强烈怀疑我的问题与我的测试中有一个逻辑错误,因为对于所有其他值,它测试的行为都是正确的。
标签: arrays laravel validation laravel-7 validationrules