2011-09-05 3 views
1

스텁이 ArrayIterator처럼 작동하도록하려면 어떻게해야합니까? 내 말은,이 스텁을 반복하고 싶다. Practical PHP Testing의 연습 문제입니다.PHPUnit - 스텁 (Stub)이 빌드 유형처럼 작동합니다.

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

iterator를 구현합니다. $ a = new FibonacciIterator (7)를 호출합니다. 그 후에는 0, 1, 1, 2, 3, 5, 8을 반복 할 수 있습니다. 고마워요. – thom

+0

작업이 실제로 'FibonacciIterator의 스텁으로 ArrayIterator를 사용한다고'하지 않습니까? – Mchl

답변

3

올바르게 이해한다면 여기의 스텁으로 ArrayIterator을 사용하여 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