PHPUnit - 检查数组是否包含特定类型的对象

时间:2015-04-02 09:23:58

标签: php arrays unit-testing phpunit

在PHPUnit中进行单元测试时,我需要检查一个数组是否包含至少一个特定类型的对象。

这是我正在寻找的一个简单的例子

$obj_1 = new Type1;
$obj_2 = new Type2; 

$container = array( $obj_1, $obj_2 );

// some logic and array manipulation here

// need something like this
$this->assertArrayHasObjectOfClass( 'Type1', $container );

显然我可以用自定义代码做到这一点,但有没有任何断言(或它们的组合)允许我这样做?

我需要在多个测试中多次这样做,所以,如果我需要的断言并不存在,我该如何扩展PHPUnit断言的集合?

编辑:具有特征的自定义解决方案

正如Vail所建议的那样,我想出了一个使用特征的自定义解决方案。这是一个简化版本。

// trait code
trait CustomAssertTrait
{
    public function assertArrayHasObjectOfType( $type, $array, $message = '' ) {

        $found = false;

        foreach( $array as $obj ) {
            if( get_class( $obj ) === $type ) {
                $found = true;
                break;
            }
        }

        $this->assertTrue( $found, $message );

    }
}

// test code
class CustomTest extends PHPUnit_Framework_TestCase {
   use CustomAssertTrait;

   // test methods... 
}

3 个答案:

答案 0 :(得分:1)

如果只检查一个对象,则使用方法assertContains()并将数组或Traversable作为第二个参数。但是这里的对象必须具有与您正在寻找的属性相同的属性(例如,id,title等) 离。

$obj_x = new Type1;
$this->assertContains($obj_x, $container);

如果数组或Traversable中的所有对象都具有相同的祖先或接口,则可以使用方法assertContainsOnlyInstancesOf()ex。

$this->assertContainsOnlyInstancesOf(Type1Type2Interface::class, $container);

https://phpunit.de/manual/5.7/en/appendixes.assertions.html#appendixes.assertions.assertContainsOnlyInstancesOf

答案 1 :(得分:0)

我认为没有断言。您需要编写一些自定义代码。

关于extendig PHPUnit断言,您可以使用自己的断言方法创建特征并将其添加到特定测试中。

或者看看这个https://phpunit.de/manual/current/en/extending-phpunit.html

答案 2 :(得分:0)

与您的解决方案类似:

$found = (bool)array_filter(function($v) use ($type) {
                                return get_class($v) === $type;
                            }, $array);