phpspec测试文件内容/文件操作

时间:2014-06-11 10:16:51

标签: php testing phpspec vfs-stream

我很好奇选择处理文件操作的类的最佳方法。

假设我有一个虚构的类,其方法duplicate的工作是复制文件的内容。

<?php

class FileOperator
{
    public function duplicate($filename)
    {
        $content = file_get_contents($filename);
        file_put_contents($filename, $content.$content);
    }
}

我知道我可以使用类似vfsStream的东西来断言更改而不触及实际的文件系统(至少在PHPUnit中使用断言)。

我怎么能在规范中断言?或者它会以不同的方式接近?

另外,我知道我可能想要将该功能提取到另一个类中并使用Spy断言FileOperator正确调用其依赖关系,但是我仍然需要指定该适配器类,我的问题仍然存在。

感谢。

1 个答案:

答案 0 :(得分: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);
    }
}

或者,您可以使用expect helper

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);
    }
}