我正在尝试验证我的FormRequest
中所需的(可能的)空数组。
我正在使用present
和array
验证规则,因为我希望传递值,但它可以是空数组。
问题是,我的测试在一个空字符串(即:'
)上失败,这告诉我我的请求没有使用该值引发预期的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
价值。
好吧,有很多事情需要改变。(不要将此视为攻击,只是建设性的回答)
首先,您没有正确地进行测试。请记住,一个测试必须只测试一件事情,在这里您要测试多个(对于许多不同的值来说没有问题),但是您要断言它是否通过,如果失败,这就是问题所在。
您必须使用@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