2016-08-05 41 views
1
public function test_cleansUpHouses() 
{ 
    $houseWithNoHP = new \DeadStreet\ValueObject\House\House(); 
    $houseWithNoHP->setHitPoints(0); 
    $houseWithNoHP->setCurrentAttackers(1); 

    $houseWithHP = new \DeadStreet\ValueObject\House\House(); 
    $houseWithHP->setCurrentAttackers(1); 

    $houseWithHPWasNotAttacked = new \DeadStreet\ValueObject\House\House(); 
    $houseWithHPWasNotAttacked->setCurrentAttackers(1); 

    $houseCollection = new \DeadStreet\ValueObject\House\Collection(
     [$houseWithNoHP, $houseWithHP, $houseWithHPWasNotAttacked] 
    ); 

    $this->mockHouseModel->expects($this->at(0)) 
     ->method('hasBeenAttacked') 
     ->with($houseWithNoHP) 
     ->willReturn(true); 

    $this->mockHouseModel->expects($this->at(1)) 
     ->method('hasBeenAttacked') 
     ->with($houseWithHP) 
     ->willReturn(true); 

    $this->mockHouseModel->expects($this->at(2)) 
     ->method('hasBeenAttacked') 
     ->with($houseWithHPWasNotAttacked) 
     ->willReturn(false); 

    $this->mockHouseModel->expects($this->at(0)) 
     ->method('requiresDestroying') 
     ->with($houseWithNoHP) 
     ->willReturn(true); 

    $this->mockHouseModel->expects($this->at(1)) 
     ->method('requiresDestroying') 
     ->with($houseWithHP) 
     ->willReturn(false); 

    $expectedHouses = [$houseWithHP, $houseWithHPWasNotAttacked]; 

    $cleanedUpHouses = $this->createObject()->cleanUpHouses($houseCollection); 
    $this->assertEquals($expectedHouses, $cleanedUpHouses->getHouses()); 
} 

private function createObject() 
{ 
    return new Collection($this->mockHouseModel); 
} 

而這裏的測試PHPUnit的測試不「走」到如果有條件

public function cleanUpHouses(\DeadStreet\ValueObject\House\Collection $collection) 
{ 
    foreach($collection->getHouses() as $key => $house) { 
     if(!$this->houseModel->hasBeenAttacked($house)) { 
      break; 
     } 

     if($this->houseModel->requiresDestroying($house)) { 
      unset($collection->getHouses()[$key]); 
     } 
    } 

    return $collection; 
} 

不過,此行if($this->houseModel->requiresDestroying($house)) {永遠不會被返回true模型,即使我有行

$this->mockHouseModel->expects($this->at(0)) 
     ->method('requiresDestroying') 
     ->with($houseWithNoHP) 
     ->willReturn(true); 

我得到的錯誤。

1) DeadStreet\Model\House\Collection_Test::test_cleansUpHouses 
Failed asserting that two arrays are equal. 
--- Expected 
+++ Actual 
@@ @@ 
Array (
    0 => DeadStreet\ValueObject\House\House Object (...) 
    1 => DeadStreet\ValueObject\House\House Object (...) 
+ 2 => DeadStreet\ValueObject\House\House Object (...) 
) 

回答

0

您確定代碼運行正常嗎?

此行

unset($collection->getHouses()[$key]); 

使用您的陣列執行上有一個未設置的副本。

實施例:

class Test 
{ 
    private $array = array("a" => 1, "b" => 2); 

    public function unsetArray() 
    { 
     unset($this->getArray["a"]); 
    } 

    public function getArray() 
    { 
     return $this->array; 
    } 
} 

$test = new Test(); 
$test->unsetArray(); 

方法unsetArray始終復位上的副本在這裏,不是實際的陣列。如果你想要那樣的東西。你必須像這樣使用實際的數組。

public function unsetArray() 
{ 
    unset($this->array["a"]); 
}