2016-12-06 2 views
1

Я пытаюсь выполнить тестирование моей службы, содержащей зависимый компонент Finder symfony2 (http://symfony.com/doc/current/components/finder.html).phpunit должен быть обходным или реализовать интерфейс Iterator

Я получаю:

[Exception] Объекты, возвращаемый Mock_Finder_91776c5c :: getIterator() должна быть проходимой или реализовать итератор

Услуга:

public function getFile($fileName, $path = '/') 
    { 

     if($this->wrapper == null || $this->connection == null) 
      throw new LogicException("call method setFTP first"); 

     // get file on ftp server 
     $this->connection->open(); 
     $downloadComplete = $this->wrapper->get($this->tmpDir . $fileName, $path . $fileName); 
     $this->connection->close(); 

     if($downloadComplete == false) 
      return false; // TODO exception ? 

     // return file downloaded 
     $this->finder->files()->in(__DIR__); 
     foreach ($this->finder as $file) { 
      return $file; 
     } 

     return false; // TODO exception ? 

    } 

И тест

class FtpServiceTest extends \PHPUnit_Framework_TestCase 
{ 

    protected $connectionMock; 
    protected $ftpWrapperMock; 
    protected $finderMock; 

    protected function setUp() 
    { 
     $this->connectionMock = $this->getConnectionMock(); 
     $this->ftpWrapperMock = $this->getFTPWrapperMock(); 
     $this->finderMock = $this->getFinderMock(); 
    } 

    protected function tearDown() 
    { 
    } 

    private function getFinderMock() 
    { 
     return $this->getMockBuilder(Finder::class) 
      ->disableOriginalConstructor() 
      ->getMock('Iterator'); 
    } 

    private function getConnectionMock() 
    { 
     return $this->getMockBuilder(Connection::class) 
      ->disableOriginalConstructor() 
      ->getMock(); 
    } 

    private function getFTPWrapperMock() 
    { 
     return $this->getMockBuilder(FTPWrapper::class) 
      ->disableOriginalConstructor() 
      ->getMock(); 
    } 

    // tests 
    public function testMe() 
    { 

     // arrange 
     $host = 'localhost'; 
     $user = 'user'; 
     $password = '1234'; 

     $filesArray = new ArrayObject(array('')); 

     $service = new FtpService('var/tmp/'); 
     $service->setFTP($this->connectionMock, $this->ftpWrapperMock); 
     $service->setFinder($this->finderMock); 

     $this->connectionMock 
      ->expects($this->once()) 
      ->method('open'); 

     $this->ftpWrapperMock 
      ->expects($this->once()) 
      ->method('get') 
      ->will($this->returnValue(true)); 

     $this->connectionMock 
      ->expects($this->once()) 
      ->method('close'); 

     $this->finderMock 
      ->expects($this->once()) 
      ->method('files') 
      ->will($this->returnValue($this->finderMock)); 

     $this->finderMock 
      ->expects($this->once()) 
      ->method('in') 
      ->will($this->returnValue($filesArray)); 

     // act 
     $file = $service->getFile('/file.zip'); 

     // assert 
     $this->assertInstanceOf(SplFileInfo::class, $file); 

    } 

} 

ответ

1

издевались экземпляр класса Finder потребность в орудиях/глумиться метод getIterator (метод getMock не принимает аргумент, так что не передать 'Iterator' строки), поэтому изменить код следующим образом:

private function getFinderMock() 
{ 
    return $this->getMockBuilder(Finder::class) 
     ->disableOriginalConstructor() 
     ->getMock(); 
} 

И Добавьте Передразнивало ожидания в методе испытаний, в качестве примера:

$this->finderMock->expects($this->once()) 
     ->method('getIterator') 
     ->willReturn(new \ArrayObject([$this->createMock(SplFileInfo::class)])); 

надежда эта помощь