1

ファイル操作を処理するクラスを指定する最良の方法に興味があります。

duplicateファイルの内容を複製することを仕事とするメソッドを持つ架空のクラスがあると仮定します。

<?php

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

vfsStream のようなものを使用して、実際のファイルシステムに触れずに変更をアサートできることを知っています (少なくとも PHPUnit でのアサーションを使用)。

仕様でそれをどのように主張できますか? それとも、別の方法でアプローチされますか?

また、その機能を別のクラスに抽出し、Spy を使用して FileOperator がその依存関係を正しく呼び出していることをアサートすることもできますが、それでもそのアダプター クラスを指定する必要があり、疑問が残ります。

ありがとう。

4

1 に答える 1

1

これは単体テストではなく機能テストである可能性が高いため、この場合 phpspec を使用するのは困難です。

あなたが主張するなら、私には2つの選択肢があります。

ファイルの内容を取得する方法も必要な場合は、次のように仕様を記述できます。

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 ヘルパーを使用することもできます。

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);
    }
}
于 2014-06-13T19:46:26.010 に答える