2015-04-02 185 views
1

在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... 
} 
+0

这将是很好,如果你可以提供你想要达到什么样的一个最小的工作示例。 – martin 2015-04-02 09:55:31

+0

如果发现你可能想从循环中断开。 – AbraCadaver 2015-04-02 22:49:37

+0

您可以尝试[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

回答

0

到您的解决方案类似:

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

这是一个智能解决方案,将所有东西都放在一条线上。但我认为我的解决方案与您的建议(我在foreach循环中添加了一个中断),这有点安全。此外,我不知道在array_filter的情况下如何在低层实现PHP关闭。我的意思是,每次循环创建闭包时,还是只创建一次,然后在所有迭代中使用它? – 2015-04-03 08:42:22

+0

创建一次。 array_filter是有效C代码的小包装。如果没有提前退出,它会更快或者更快。 – 2018-02-12 12:00:24

0

如果选中了一个对象的使用方法assertContains()和地方数组或Traversable的作为第二个参数。但是这里的对象必须与你正在寻找的对象具有相同的属性(例如,id,标题等) ex。

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

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

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

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

相关问题