PHPUnit - 检查数组是否包含特定类型的对象
在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断言?
编辑:与特质
至于建议由韦尔定制的解决方案,我想出了这个用性状的定制解决方案。这是一个简单的版本。
// 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...
}
我不认为有这个说法。您需要编写一些自定义代码。
关于extendig PHPUnit断言,您可以使用自己的断言方法创建trait并将其添加到特定的测试中。
还是看这个https://phpunit.de/manual/current/en/extending-phpunit.html
到您的解决方案类似:
$found = (bool)array_filter(function($v) use ($type) {
return get_class($v) === $type;
}, $array);
这是一个智能解决方案,将所有东西都放在一条线上。但我认为我的解决方案与您的建议(我在foreach循环中添加了一个中断),这有点安全。此外,我不知道在array_filter的情况下如何在低层实现PHP关闭。我的意思是,每次循环创建闭包时,还是只创建一次,然后在所有迭代中使用它? – 2015-04-03 08:42:22
创建一次。 array_filter是有效C代码的小包装。如果没有提前退出,它会更快或者更快。 – 2018-02-12 12:00:24
如果选中了一个对象的使用方法assertContains()和地方数组或Traversable的作为第二个参数。但是这里的对象必须与你正在寻找的对象具有相同的属性(例如,id,标题等) ex。
$obj_x = new Type1;
$this->assertContains($obj_x, $container);
如果数组或Traversable的所有对象都具有相同的祖先或接口,您可以使用方法assertContainsOnlyInstancesOf()前。
$this->assertContainsOnlyInstancesOf(Type1Type2Interface::class, $container);
这将是很好,如果你可以提供你想要达到什么样的一个最小的工作示例。 – martin 2015-04-02 09:55:31
如果发现你可能想从循环中断开。 – AbraCadaver 2015-04-02 22:49:37
您可以尝试[assertInstanceOf()](https://github.com/sebastianbergmann/phpunit/blob/master/src/Framework/Assert.php#L1236)作为[示例](https://github.com/ sebastianbergmann/PHPUnit的/斑点/主/测试/框架/ AssertTest.php#L3835)。 – acfreitas 2015-04-07 19:49:09