2011-09-05 43 views
1

如何使我的存根行爲像一個ArrayIterator,例如?我的意思是,我想遍歷這個存根。這是來自實踐PHP測試的練習。PHPUnit - 存根類似於構建類型

7.2 
Write a EvenIterator which takes a FibonacciIterator an iterates only 
on the even-indexed values (returning 0, 1, 3, 8, 21...). 
7.3 
Write tests for the EvenIterator class, stubbing out the 
FibonacciIterator using an ArrayIterator in substitution, which is provided 
by the Spl (otherwise it will never terminate!) 

謝謝。

+0

對FibonacciIterator的正常調用看起來像什麼? – Fenton

+0

它實現了一個迭代器。你可以調用$ a = new FibonacciIterator(7)。之後,您可以迭代0,1,1,2,3,5,8。謝謝。 – thom

+0

這個任務不是說'使用ArrayIterator作爲FibonacciIterator的存根'嗎? – Mchl

回答

3

如果我理解正確,這裏的任務是使用ArrayIterator作爲FibonacciIterator的存根測試EvenIterator。 因此,例如加載ArrayIterator與偶數值數組,傳遞給EvenIterator,你應該得到相同的值。然後對奇數值數組執行相同操作,並且應該獲得空的結果集。


class EvenIteratorTest extends \PHPUnit_Framework_TestCase { 

    public function testDoesNotRemoveEvens() { 

    $data = array(2,4,6,8); 
    $arrayIterator = new \ArrayIterator($data); 
    $object = new EvenIterator($arrayIterator); 

    $expected = $data; 
    $actual = array(); 
    foreach($object as $v) { 
     $actual[] = $v; 
    } 
    $this->assertEquals($expected,$actual); 
    } 

    public function testFiltersOutOdds() { 

    $data = array(1,3,5,7); 
    $arrayIterator = new \ArrayIterator($data); 
    $object = new EvenIterator($arrayIterator); 

    $actual = array(); 
    foreach($object as $v) { 
     $actual[] = $v; 
    } 
    $this->assertEmpty($actual); 
    } 

} 

正如你可以看到,有很多重複的代碼,所以一些重構將到位。

+0

你可以用代碼來解釋你說的嗎?非常感謝Mchl。 – thom

+0

SUre。它非常簡單(結果有點難看),因爲我不知道你的實現細節,或者你使用的是哪個測試框架。 – Mchl

+0

哦,是啊...只是注意到它是PHPUnit ...傻我... – Mchl