PHPUnit:如何检查数组是否具有具有特定属性的对象?
假设我们有以下数组,PHPUnit:如何检查数组是否具有具有特定属性的对象?,phpunit,Phpunit,假设我们有以下数组,$myArray,要根据var\u导出进行检查: 数组( 0=>AnObject::\u设置\u状态(数组)( “id”=>10, 'name'=>'foo' )), 1=>AnObject::\u设置\u状态(数组)( “id”=>23, 'name'=>'bar' )), 2=>AnObject::\u设置\u状态(数组)( “id”=>55, 'name'=>'baz' )), ) 如果此数组包含一个名为'bar'的对象,则断言应通过 我知道如果我知道AnObject
$myArray
,要根据var\u导出进行检查:
数组(
0=>AnObject::\u设置\u状态(数组)(
“id”=>10,
'name'=>'foo'
)),
1=>AnObject::\u设置\u状态(数组)(
“id”=>23,
'name'=>'bar'
)),
2=>AnObject::\u设置\u状态(数组)(
“id”=>55,
'name'=>'baz'
)),
)
如果此数组包含一个名为'bar'
的对象,则断言应通过
我知道如果我知道AnObject
值的位置,我可以使用:
$this->assertAttributeSame('bar','name',$myArray[1]);
是否有某种方法可以使用$this->assertThat()
,或其他类型的contains来检查整个数组,并返回其中一个具有匹配属性的对象的true?没有这种内置断言,我想不出任何可能将它们组合起来以获得预期结果
我建议您创建一个helper方法,该方法接受数组并在循环中执行必要的检查
另一种解决方案是仅为这种情况创建全新的断言,但我认为这对于这项任务来说是一种过分的做法;-) 在虫族提供的答案的基础上,下面是我如何完成这项任务的:
PHPUnit_Framework_Assert::assertTrue($this->assertArrayContainsSameObject($yourArray, $theObjectToCheck));
要检查数组是否包含具有相同属性和值的对象(即不一定引用同一实例),请执行以下操作:
要检查相同的引用,只需将==
更改为==
要解决原始海报的问题:
PHPUnit_Framework_Assert::assertTrue($this->assertArrayContainsSameObjectWithValue($yourArray, 'name', 'bar'));
private function assertArrayContainsSameObjectWithValue($theArray, $attribute, $value)
{
foreach($theArray as $arrayItem) {
if($arrayItem->$attribute == $value) {
return true;
}
}
return false;
}
这取决于,如果您需要更频繁地进行检查,或者实际的比较变得越来越复杂:一个自己的断言并不难集成。只是说说而已。
PHPUnit_Framework_Assert::assertTrue($this->assertArrayContainsSameObjectWithValue($yourArray, 'name', 'bar'));
private function assertArrayContainsSameObjectWithValue($theArray, $attribute, $value)
{
foreach($theArray as $arrayItem) {
if($arrayItem->$attribute == $value) {
return true;
}
}
return false;
}