如何使用PHPUnit和VFSstream模拟只读目录

时间:2015-08-16 18:36:41

标签: php phpunit vfs-stream

我有一个简单的开放(文件)方法,如果无法在给定路径中打开或创建文件,则应抛出异常:

const ERR_MSG_OPEN_FILE = 'Failed to open or create file at %s';

public function open($filePath)
{
    ini_set('auto_detect_line_endings', TRUE);

    if (false !== ($this->handler = @fopen($filePath, 'c+'))) {
        return true;
    } else {
        throw new \Exception(
            sprintf(self::ERR_MSG_OPEN_FILE, $filePath)
        );
    }
}

使用PHPUnit和VFSStream进行单元测试:

$structure = [
        'sample.csv' => file_get_contents(__DIR__ . '/../sampleFiles/small.csv')
    ];

$this->root = vfsStream::setup('exampleDir', null, $structure);

$existingFilePath = vfsStream::url('exampleDir') . DIRECTORY_SEPARATOR . 'sample.csv';

$this->file = new File();
$this->file->open($existingFilePath);

上面的设置创建了一个虚拟目录结构,其中包含一个模拟文件(从现有的CSV文件中读取/克隆),这满足open方法打开文件的要求。而且如果我传递一个不同的路径(没有现有文件),它将在同一个虚拟结构中创建。

现在为了覆盖异常,我想将现成的目录添加到现有的结构中,假设一个文件夹属于另一个用户而且我没有写入权限,就像我尝试打开时一样该文件夹中的一个非现有文件,尝试创建一个文件应该失败,open方法应该抛出异常。

唯一的问题是,......我不知道怎么做:D

任何建议,提示和指导将不胜感激:)

1 个答案:

答案 0 :(得分:0)

您只需将模拟目录的网址指向错误的路径即可。

$existingFilePath = vfsStream::url('badExampleDir') . DIRECTORY_SEPARATOR . 'incorrect.csv';

考虑到 badExampleDir 从未设置过,您的方法将无法在其中创建文件。