2016-12-27 48 views
6

Powiedzmy, że mam następujący interfejs:Mocking funkcję zwracającą Generator w PHP z PHPUnit/Phake

interface MyInterface 
{ 
    public function yieldData(); 
} 

Chcę stworzyć makietę tego interfejsu, na przykład tak:

$mocked_instance = Phake::partialMock(MyInterface::class); 

Jaki jest najbardziej preferowany sposób na modelowanie metody yield? To jest najlepsze, co wymyśliłem:

Phake::when($mocked_instance)->yieldData()->thenReturn([]); 

Czy istnieje sposób, aby zrobić to w PHPUnit/Phake że bardziej przypomina oryginalną funkcjonalność funkcji (tj powracającego Generator)?

+2

Nie jestem pewien, jak to osiągnąć w miły sposób. Nie możesz uzyskać 'Generatora', chyba że' yield' go utworzył, więc zakładam, że potrzebujesz funkcji/metody pozornego pomocnika, których jedynym celem jest "zdobycie czegoś, co by mogło karmić twoją próbą. –

Odpowiedz

3

Dziękuję Oliver Maksimovic za komentarz, który pomógł mi znaleźć rozwiązanie, które działa dla mnie.

Zdecydowałem się stworzyć następującą funkcję na mojej podstawowej testcase:

/* 
* @param array @array 
* 
* @return \Generator|[] 
*/ 
protected function arrayAsGenerator(array $array) 
{ 
    foreach ($array as $item) { 
     yield $item; 
    } 
} 

To pozwala mi wykonać następujące czynności:

$mocked_instance = Phake::partialMock(MyInterface::class); 

$numbers = [1, 2, 3, 4, 5]; 

Phake::when($mocked_instance) 
    ->yieldData() 
    ->thenReturn($this->arrayAsGenerator($numbers));