当前位置: 首页 > 知识库问答 >
问题:

Laravel 7空数组验证

惠洛华
2023-03-14

我正在尝试验证我的FormRequest中所需的(可能的)空数组。

我正在使用presentarray验证规则,因为我希望传递值,但它可以是空数组。

问题是,我的测试在一个空字符串(即:')上失败,这告诉我我的请求没有使用该值引发预期的ValidationException

我的测试包括给定字段的以下值:

如何测试预期的请求参数是否存在,是一个数组,可能是一个空数组?

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']
                );
            }
        }
    }

我试过了

  • 现在数组
  • 数组
  • 需要数组

但是这些都没有通过验证。

发现这个老问题,描述了我的情况:它似乎不可能实现我的目标与可用的验证规则;此注释指出,更接近的解决方案是使用ConvertBacktyStringsToNull将空字符串转换为空,并测试验证只是针对null价值。

共有1个答案

谢英光
2023-03-14

好吧,有很多事情需要改变。(不要将此视为攻击,只是建设性的回答)

首先,您没有正确地进行测试。请记住,一个测试必须只测试一件事情,在这里您要测试多个(对于许多不同的值来说没有问题),但是您要断言它是否通过,如果失败,这就是问题所在。

您必须使用@dataProvider或@testWith以不同的值执行多个测试。

因此,您的测试将如下所示:

/**
 * @dataProvider inputValues
 */
public function testTest($value)
{
    $response = $this->post('/exampleUrl', ['array_field' => $value]);

    $response->assertSessionHasErrors('array_field');
}

public function inputValues()
{
    return [
        'null is passed' => [null],
        'string is passed' => ['string'],
        'empty string is passed' => [''],
        'integer is passed' => [123],
        'float is passed' => [123.456],
        'boolean is passed' => [true]
    ];
}

这样,您将得到如下错误:

phpunit DataTest
PHPUnit 5.7.0 by Sebastian Bergmann and contributors.

...F

Time: 0 seconds, Memory: 5.75Mb

There was 1 failure:

1) DataTest::testTest with data set "empty string is passed" ('')
Session missing error: array_field.

/home/sb/DataTest.php:9

FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

正如您所看到的,我不是在测试“成功”的东西,因为这些是单独的测试。在您断言它是否工作的测试中,您已经传递了一个被接受的值,因此您不必测试它是否对空数组或包含数据的数组没有错误,它在该测试中是显式的。

请添加更多关于您正在测试的内容的信息,因为您的TestRequest非常奇怪,您不需要它以及您在上面的所有进一步设置来测试它。

所以,要解决你的问题,你的规则是不正确的。正如文档所说:“验证中的字段必须出现在输入数据中,但可以为空。”。如果您看到源html" target="_blank">代码,您将看到它可以有一个空值,如null'。所以你想使用规则array,就是这样。它必须存在,但必须是一个数组,不管它是否为空。你想要那个!

 类似资料:
  • 我有一个数组对象作为道具传递数组看起来像: 我想做的是添加propTypes验证,比如 标题:道具类型。一串需要 sub_items:PropTypes.array sub_items:数组内的道具验证,如标题刺痛和isDriningboolean。 请注意如何在阵列上实现这一点。(注:我的知识非常有限,所以如果我问了一个明显愚蠢的问题,请原谅)

  • 我是XML验证方面的新手,在调用adobe server生成PDF之前,我被要求对XML进行验证。我有以下内容,我们通过对象获取XML,然后调用。如果有任何元素为null或空以停止生成pdf,任何人都可以帮助我一步一步地验证XML吗

  • 问题内容: 如果未初始化int数组的各个元素,则默认情况下存储在其中的内容是什么?我显然发现其中有一个空数组或空数组。有什么区别,哪一个适用于我的第一个问题? 问题答案: 从技术上讲,没有 null数组 之类的东西;但是由于数组是对象,所以数组类型是引用类型(即:数组变量仅保存对数组的 引用 ),这意味着数组变量可以而不是实际指向数组: 一个 空 数组是零长度的阵列; 它没有元素: (并且 永远不

  • 我试图验证下面的响应,这是一个没有数组名称的数组。 当我尝试使用下面的匹配时,每个脚本都会出错。 ' 错误:com.intuit.karate.exception.KarateExcture:期望在路径$中找到属性为['soldTo']的对象,但找到了'net.minidev.json.JSONArray'。com.intuit.karate.StepDefs.match命名(StepDefs.j

  • 我在响应中有一个类似这样的未命名JSON数组,我想检查它是否包含。我可以知道我怎样在空手道中检查吗?

  • 我尝试过的解决方案: 1.以下代码 https://gist.github.com/huzemin/e8d7a904cec55d4d7635c9322f143c42