2016-08-05 33 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"]); 
}