使用PhpSpec测试Symfony 2 Finder组件的实现

时间:2016-03-03 11:43:13

标签: php symfony tdd php-5.6 phpspec

在测试使用Filesystem组件访问Symfony 2应用程序中的文件系统,然后使用Finder组件访问目录中的文件列表时,出现以下错误。

Call to undefined method Prophecy\Prophecy\MethodProphecy::in()

这是我正在测试的方法的片段:

$finder = new Finder();

if ($filesystem->exists($imageImportPath)) {
   $finder->files()->in($imageImportPath);
   foreach ($finder as $image) {         
      // ...do some stuff in here with uploading images and creating an entity...
      $this->entityManager->persist($entity);
      $this->entityManager->flush($entity);
   }    
}

这是帮助类的规范:

function it_imports_image_assets(
    Filesystem $filesystem,
    EntityManager $entityManager,
    Finder $finder
) {
    $imageImportPath = '/var/www/crmpicco/app/files/images/rfc-1872/';
    $filesystem->exists($imageImportPath)->willReturn(true);

    $finder->files()->in($imageImportPath)->shouldHaveCount(2);

    $this->importImageAssets($imageImportPath)->shouldReturn([]);
}

1 个答案:

答案 0 :(得分:1)

您不想使用真实文件测试您的方法(查看我认为您想要执行的代码),测试应该没有它。您需要对代码进行单元测试,因此您可以将Finder找到的文件路径伪装成您喜欢的任何内容,代码不应该依赖某些第三方文件才能通过测试。

您需要在Finder方法上返回$finder->files()对象,请参阅下文:

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

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

示例:

use Symfony\Component\Finder\SplFileInfo;
//..

function it_imports_image_assets(
    Filesystem $filesystem,
    EntityManager $entityManager,
    Finder $finder,
    SplFileInfo $file1,
    SplFileInfo $file2
) {
    $imageImportPath = '/var/www/crmpicco/app/files/images/rfc-1872/';
    $filesystem->exists($imageImportPath)->willReturn(true);
    $finder->files()->willReturn($finder);
    $finder->in($imageImportPath)->willReturn($finder);

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

    $file1->getPathname()->willReturn($imageImportPath.'file1.txt');
    $file2->getPathname()->willReturn($imageImportPath.'file1.txt');

    //...

    $this->importImageAssets($imageImportPath)->shouldReturn([]);
}