0

所以我目前正在进行单元测试,在旅行中我发现我可能还需要模拟文件系统以及数据库查询等。

我从 PHPUnit 文档中阅读了一个建议,即 vfsStream 是一个很好的模拟文件系统的库。

不过,我在使用它时遇到了问题。

尽管在 GitHub 上托管的 wiki 中提供了以下文档,但我并不真正了解如何设置它。

我已经使用一些恰当命名的方法将文件系统交互抽象到它自己的类中。这似乎不是手头的问题,因为当我没有模拟文件系统时,它按预期工作。

这是我设置测试的方式:

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

据我从文档中可以看出,这应该可以工作,但显然我对它的阅读是不正确的,而且我在某些地方出了差错。

关于如何解决此问题的任何提示,因为我一直在一遍又一遍地改变线路,并且无法为我的生活弄清楚。

先感谢您!

4

1 回答 1

0

我似乎已经解决了这个问题。修复的方式......有点不满意,也许有人可以帮助解释这背后的原因,我会很高兴。

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 wiki 上找到。我确实相信我可能误读了文档,因此对此问题的更正也将不胜感激。

于 2013-06-01T10:11:00.643 回答