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);
    }
}
Другие вопросы по тегам