phpspec тестирование содержимого файла / файловые операции
Мне интересно, как лучше определить классы, которые обрабатывают файловые операции.
Предполагая, что у меня есть вымышленный класс с методом duplicate
чья работа заключается в копировании содержимого файла.
<?php
class FileOperator
{
public function duplicate($filename)
{
$content = file_get_contents($filename);
file_put_contents($filename, $content.$content);
}
}
Я знаю, что могу использовать что-то вроде vfsStream для подтверждения изменений, не затрагивая реальную файловую систему (по крайней мере, с утверждениями в PHPUnit).
Как я могу утверждать, что в спецификации? Или это будет подходить по-другому?
Кроме того, я понимаю, что могу захотеть извлечь эту функциональность в другой класс и использовать Spy, чтобы утверждать, что FileOperator правильно вызывает свою зависимость, но тогда мне все равно придется указать этот класс адаптера, и мой вопрос остается.
Благодарю.
1 ответ
Это скорее функциональный тест, а не модульный тест, поэтому в этом случае сложно использовать phpspec.
Если вы настаиваете, я вижу два варианта.
Если вам нужен метод для извлечения содержимого файла, вы можете написать свою спецификацию следующим образом:
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamDirectory;
use PhpSpec\ObjectBehavior;
class FileOperatorSpec extends ObjectBehavior
{
/**
* @var vfsStreamDirectory
*/
private $workDir;
function let()
{
$this->workDir = vfsStream::setup('workDir');
}
function it_duplicates_a_content_in_a_file()
{
$this->createFile('foo', 'bar');
$this->duplicate('vfs://workDir/foo');
$this->read('vfs://workDir/foo')->shouldReturn('barbar');
}
private function createFile($path, $content)
{
$file = vfsStream::newFile($path);
$file->setContent($content);
$this->workDir->addChild($file);
}
}
В качестве альтернативы вы можете использовать ожидающий помощник:
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamDirectory;
use PhpSpec\ObjectBehavior;
class FileOperatorSpec extends ObjectBehavior
{
/**
* @var vfsStreamDirectory
*/
private $workDir;
function let()
{
$this->workDir = vfsStream::setup('workDir');
}
function it_duplicates_a_content_in_a_file()
{
$this->createFile('foo', 'bar');
$this->duplicate('vfs://workDir/foo');
expect(file_get_contents('vfs://workDir/foo'))->toBe('barbar');
}
private function createFile($path, $content)
{
$file = vfsStream::newFile($path);
$file->setContent($content);
$this->workDir->addChild($file);
}
}