使用 PhpSpec 测试 Symfony 2 Finder 组件的实现
Testing implementation of Symfony 2 Finder component with 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);
}
}
这是我的助手规范 class:
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([]);
}
您不想使用真实文件测试您的方法(查看代码,我假设您想要这样做),没有它测试应该可以工作。您需要对您的代码进行单元测试,因此您可以将 Finder
找到的文件路径伪造为您喜欢的任何内容,代码不应依赖某些第 3 方文件才能通过测试。
您需要 return 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([]);
}
在使用 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);
}
}
这是我的助手规范 class:
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([]);
}
您不想使用真实文件测试您的方法(查看代码,我假设您想要这样做),没有它测试应该可以工作。您需要对您的代码进行单元测试,因此您可以将 Finder
找到的文件路径伪造为您喜欢的任何内容,代码不应依赖某些第 3 方文件才能通过测试。
您需要 return 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([]);
}