2016-03-04 2 views
1

Я пытаюсь протестировать импортер изображения, который берет файл и представляет форму с прикрепленным изображением. Эта часть теста, похоже, является той частью, где она падает, и я не уверен, как ее решить.Тестирование добавлено UploadedFile to form submit with PhpSpec

Я понимаю концепцию не «насмешки над тем, что у вас нет», однако без подтверждения вызова частного метода insertImageThroughForm тест не работает.

я получаю следующее сообщение об ошибке:

75 ! imports image assets 
     method call: 
      - submit(["file" => ["assetFile" => ["file" => Symfony\Component\HttpFoundation\File\UploadedFile:0000000027d380bc00007f8c6cad27ec Object (
      'test' => false 
      'originalName' => 'picco.jpg' 
      'mimeType' => 'application/octet-stream' 
      'size' => null 
      'error' => 0 
     )]]], false) 
     on Double\Symfony\Component\Form\Form\P22 was not expected, expected calls were: 
      - submit(exact(["file" => ["assetFile" => ["file" => Double\Symfony\Component\Finder\SplFileInfo\P19:0000000027d3807500007f8c6cad27ec Object (
      'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*) 
      'relativePath' => null 
      'relativePathname' => null 
     )]]]), exact(false)) 
      - submit(exact(["file" => ["assetFile" => ["file" => Double\Symfony\Component\Finder\SplFileInfo\P20:0000000027d3803000007f8c6cad27ec Object (
      'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*) 
      'relativePath' => null 
      'relativePathname' => null 
     )]]]), exact(false)) 

ImageImporterSpec.php

const TEMP_PATH = '/tmp/crmpicco/imageImporter'; 

function it_imports_image_assets(
    Category $category, 
    AssetFactory $assetFactory, 
    Asset $asset, 
    Finder $finder, 
    SplFileInfo $file1, 
    SplFileInfo $file2, 
    FormFactory $formFactory, 
    Form $form 
) { 
    $category->getId()->willReturn(14); 

    $createTempPathFilesystem = new Filesystem(); 
    $createTempPathFilesystem->mkdir(self::TEMP_PATH); 
    $createTempPathFilesystem->mkdir(self::TEMP_PATH . DIRECTORY_SEPARATOR . 'courses'); 

    $imageImportPath = self::TEMP_PATH . DIRECTORY_SEPARATOR . 'courses/'; 

    $createTempPathFilesystem->touch($imageImportPath . 'picco.jpg'); 
    $createTempPathFilesystem->touch($imageImportPath . 'morton.jpg'); 

    $finder->files()->willReturn($finder); 
    $finder->in($imageImportPath)->willReturn($finder); 

    $finder->getIterator()->willReturn(new \ArrayIterator([ 
     $file1->getWrappedObject(), 
     $file2->getWrappedObject(), 
    ])); 

    $file1->getPathname()->willReturn($imageImportPath . 'picco.jpg'); 
    $file2->getPathname()->willReturn($imageImportPath . 'morton.jpg'); 

    $assetFactory->createForCategory(14)->willReturn($asset); 

    $formFactory->create('category_asset', $asset, ['csrf_protection' => false])->willReturn($form); 

    $form->submit(['file' => ['assetFile' => ['file' => $file1->getWrappedObject()]]], false)->shouldBeCalled(); 
    $form->submit(['file' => ['assetFile' => ['file' => $file2->getWrappedObject()]]], false)->shouldBeCalled(); 

    $this->importImageAssets('courses/', $category)->shouldBeCalled(); 
} 

ImageImporter.php

public function importImageAssets($importDirectory, Category $category) 
{ 
    $finder = new Finder(); 
    $finder->files()->in($importDirectory); 
    if (count($finder) > 0) { 
     foreach ($finder as $image) { 
      $filename = $image->getBasename('.' . $image->getExtension()); 
      $filepath = $importDirectory . '/' . $image->getFilename(); 

      $asset = $this->assetFactory->createForCategory($category->getId()); 

      $asset->setName($filename); 

      $this->insertImageThroughForm($asset, $filepath); 

      $this->entityManager->persist($asset); 
     } 
     $this->entityManager->flush(); 
    } 
} 

private function insertImageThroughForm(Asset $asset, $filePath) 
{ 
    $form = $this->formFactory->create('category_asset', $asset, ['csrf_protection' => false]); 

    $uploadedFile = new UploadedFile($filePath, basename($filePath)); 

    $form->submit(['file' => ['assetFile' => ['file' => $uploadedFile]]], false); 
} 

ответ

4

Что вы проверяете более тест интеграции, чем модульного тестирования. PhpSpec не подходит для интеграционных тестов, но только для низкоуровневых тестов. Почему это интеграционный тест? Потому что вы используете реальную файловую систему, которая является внешним сервисом, а также немного сторонних библиотек, таких как Filesystem и Finder.

Вы пытаетесь высмеять Finder, но Finder непосредственно инициализируется в рамках метода, поэтому его нельзя издеваться. Вам нужно ввести Finder в качестве зависимости класса.

+0

Спасибо, я уже пришел к выводу, что PhpSpec не был правильным инструментом для работы - так спасибо за подтверждение. В конце концов я написал несколько сценариев Behat, чтобы выполнить эту работу. – crmpicco

 Смежные вопросы

  • Нет связанных вопросов^_^