2015-04-02 227 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

相關問題