Тестирование с помощью vsfStream и PHP Unit

Так что в данный момент я беру на себя тестирование модулей, и во время своих путешествий я обнаружил, что мне также может понадобиться смоделировать файловую систему, а также запросы к базе данных и тому подобное.

Я прочитал рекомендацию из документации PHPUnit, что vfsStream - хорошая библиотека для насмешек над файловой системой.

У меня проблемы с его использованием, хотя.

Я не совсем понимаю, как его настроить, несмотря на следующую документацию, представленную в вики, размещенной на GitHub.

Я абстрагировал взаимодействие файловой системы в своем собственном классе с помощью метких методов. Похоже, это не проблема, потому что когда я не издевался над файловой системой, она работала так, как задумывалось.

Вот как я настраиваю тест:

public function setUp()
{
    // Setup here
    $this->filesystem   =   new Filesystem;
    vfsStreamWrapper::register();
    $this->root         =   vfsStream::setup('test-dir');
}

Вот пример теста, который я написал, чтобы проверить создание каталога:

public function testCanCreateDirectory()
{
    $dir        =   vfsStream::url($this->root->path() . '/sub-dir');
    $filesystem =   $this->filesystem;
    $filesystem->makeDirectory($dir);
    $this->assertTrue($filesystem->isDirectory($dir));
}

Кажется, это работает, пока все хорошо. Однако следующий тест не пройден:

public function testCanPutFile()
{
    $file       =   $this->root->url() . '/sub-dir/test.txt';
    $contents   =   "test text";
    $filesystem =   $this->filesystem;
    $filesystem->put($file, $contents);
    $this->assertTrue($filesystem->isFile($file));
    $this->assertEquals($contents, $filesystem->get($file));
}

Насколько я могу судить по документации, это должно сработать, но, очевидно, мое прочтение неверно, и я где-то ошибся.

Любые намеки на то, как я могу решить эту проблему, так как я менял строки снова и снова и не могу понять это ради своей жизни.

Заранее спасибо!

1 ответ

Решение

Я, кажется, решил это. Способ исправления... несколько неудовлетворительный, может быть, кто-то мог бы помочь объяснить причины этого, я был бы счастлив.

public function testCanPutFile()
{
    $dir        =   vfsStream::url($this->root->path()) . '/sub-dir';
    $file       =   $dir . '/test.txt';
    $contents   =   "test text";
    $filesystem =   $this->filesystem;

    $this->assertTrue($filesystem->makeDirectory($dir));
    $this->assertTrue($filesystem->isDirectory($dir));

    $filesystem->put($file, $contents);

    $this->assertTrue($filesystem->isFile($file));
    $this->assertEquals($contents, $filesystem->get($file));
}

Вот как я исправил проблему. Похоже, я должен воссоздать структуру для каждого метода испытаний. Я не очень понимаю, почему я должен делать это таким образом. Может быть, я что-то здесь упускаю, но я не вижу, что я делаю неправильно, и в интернете есть приличное количество приличных примеров, большинство из которых можно найти в вики GitHub авторов. Я действительно полагаю, что, возможно, неправильно прочитал документацию, так что исправление по этому вопросу также будет высоко оценено.

Другие вопросы по тегам