当文件不存在时,File_get_contents不评估为false

时间:2017-05-18 08:39:21

标签: php exception-handling phpunit file-get-contents

我试图在我的代码中测试异常。

public function testGetFileThrowsException(){
    $this->expectException(FileNotFoundException::class);
    $file = "db.json";
    $this->review->getData($file);
}

" db.json"文件不存在。我的目标是使用getData()文件来抛出FileNotFoundException。这是getData()代码:

public function getData($path){

    if(file_get_contents($path) === false){
        throw new FileNotFoundException;
    }
    return $file;
}

问题是,而不是评估为False并抛出异常,而file_get_contents函数返回:

1) CompanyReviewTest::testGetFileThrowsException
file_get_contents(db.json): failed to open stream: No such file or directory

因此测试没有成功运行。关于为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:2)

localStorage生成E_WARNING级别错误(无法打开流),这是您要在您的异常类中处理它时要禁止的内容。

您可以在file_get_contents()前添加PHP's error control operator @来取消此警告,例如:

file_get_contents()

以上回应为false,如果没有<?php $path = 'test.php'; if (@file_get_contents($path) === false) { echo 'false'; die(); } echo 'true'; ?> 运算符,则返回E_WARNING和echoed false。情况可能是警告错误干扰了你的投掷功能,但是没有看到代码,这很难说。

答案 1 :(得分:0)

你有2个解决方案,可怜的就是隐藏错误

public function getData($path){

    if(@file_get_contents($path) === false){
        throw new FileNotFoundException;
    }
    return $file;
}

或者检查文件是否存在(我猜的更好的解决方案)

public function getData($path){

if(file_exists($path) === false){
    throw new FileNotFoundException;
}
return $file;
}