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

PHPUnit-检查数组是否包含特定类型的对象,php,arrays,unit-testing,phpunit,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( 'Typ

在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 );
显然,我可以用自定义代码来实现这一点,但是否有任何断言或它们的组合允许我实现这一点

我需要在多个测试中多次这样做,因此,如果我需要的断言没有esist,我如何扩展PHPUnit断言集

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

正如威尔所建议的,我使用traits为这个问题提出了一个定制解决方案。这是一个简化的版本

// 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... 
}

我不认为这是一个断言。您需要编写一些自定义代码

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


或者看看这个

我不认为有这样的断言。您需要编写一些自定义代码

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


或者查看与您的解决方案类似的:

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

与您的解决方案类似:

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

如果只选中一个对象,请使用方法assertContains并将array或Traversable作为第二个参数。但这里的对象必须和您要查找的对象具有相同的属性,例如id、标题等。 前

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

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

如果只选中一个对象,请使用方法assertContains并将array或Traversable作为第二个参数。但这里的对象必须和您要查找的对象具有相同的属性,例如id、标题等。 前

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

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

如果你能为你想要实现的目标提供一个最简单的工作示例,那就太好了。如果你发现了,你可能想打破这个循环。你可以试一下。我不认为我可以,因为我必须把它放在for/foreach循环中,如果第一次出现的不是我要找的类,然后执行就会停止。如果你能提供一个你想要实现的最低限度的工作示例,那就太好了。如果你发现了,你可能想打破循环。你可以尝试作为。我不认为我可以,因为我必须将它放在for/foreach循环中,如果第一次出现的不是我正在寻找的类,然后执行将停止。这是一个聪明的解决方案,将所有内容都放在一行中。但是我认为我的解决方案和你的建议,我在foreach循环中添加了一个中断,这样内存会更安全一些。此外,我不知道在数组过滤器的情况下,PHP闭包是如何在低层实现的。我的意思是,闭包是在每次循环时创建的,还是创建一次然后被所有迭代使用?创建一次。数组过滤器是高效C代码的小包装器。它比任何没有提前退出的php循环都快。数组是第一个参数,而不是回调。是的,谢谢@Aymenebourafaith这是一个聪明的解决方案,可以将所有内容都放在一行中。但是我认为我的解决方案和你的建议,我在foreach循环中添加了一个中断,这样内存会更安全一些。此外,我不知道在数组过滤器的情况下,PHP闭包是如何在低层实现的。我的意思是,闭包是在每次循环时创建的,还是创建一次然后被所有迭代使用?创建一次。数组过滤器是高效C代码的小包装器。它比任何没有提前退出的php循环都快。数组是第一个参数,而不是回调。是的,谢谢@AymeneBourafai