Тестирование с помощью 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 авторов. Я действительно полагаю, что, возможно, неправильно прочитал документацию, так что исправление по этому вопросу также будет высоко оценено.