gpt4 book ai didi

PHPUnit 和 Git : How to test with unreadable file?

转载 作者:可可西里 更新时间:2023-11-01 13:21:14 25 4
gpt4 key购买 nike

简短版本:对于单元测试,我需要一个不可读的文件来确保抛出正确的异常。显然,Git 无法存储那个不可读的文件,所以我在测试时 chmod 000 并使用 git update-index --assume-unchanged 这样 Git 就不会“t 尝试存储不可读的文件。但是后来我无法 checkout 不同的分支,但收到错误消息“您对以下文件的本地更改将被 checkout 覆盖。”

是否有更好的测试方法,或者更好的 Git 使用方法,以便一切正常运行?

长版本:在一个类中,我有一个方法来读取文件,以便可以将其内容导入数据库:

public function readFile($path) {
...
if(!is_readable($path))
throw new FileNotReadableException("The file $path is not readable");
...
}

我使用 PHPUnit 测试该方法,特别是一个测试应该(间接)触发 FileNotReadableException:

/**
* @expectedException Data\Exceptions\FileNotReadableException
*/
public function testFileNotReadableException() {
$file = '/_files/6504/58/6332_unreadable.xlsx';
@chmod(__DIR__ . $file, 0000);
$import = Import::find(58);
$import->importFile(array('ID'=>2, 'newFilename'=> $file), __DIR__);
}

经过测试,git checkout other_branch 会中止:

error: Your local changes to the following files would be overwritten by checkout:
Data/Tests/_files/6504/58/6332_unreadable.xlsx
Please, commit your changes or stash them before you can switch branches.
Aborting

最佳答案

您有几个选择。

在重置文件权限的测试中添加一个tearDown()方法,这样git就不会认为文件被修改了。然后即使测试失败,文件也会被重置。

http://phpunit.de/manual/current/en/fixtures.html

public function tearDown() {
@chmod(__DIR__ . $file, 0755); //Whatever the old permissions were;
}

如果您使用的是 PHP 5.3+,则可以使用名称间距并模拟 is_readable 函数。在您的测试文件中,用您自己的函数覆盖 is_readable。您将需要确保您的覆盖与您正在测试的类位于同一命名空间中。

http://www.schmengler-se.de/-php-mocking-built-in-functions-like-time-in-unit-tests

在你的类里面你会这样做:

namespace SUT

class SUT {
public function readFile($path) {
...
if(!is_readable($path))
throw new FileNotReadableException("The file $path is not readable");
...
}
}

然后在您的测试中执行以下操作:

namespace SUT

function is_readable($filename) {
if (str_pos('unreadable') !== FALSE)) {
return false;
}

return true;
}

class SUTTest extends PHPUNIT_Framework_TestCase {
/**
* @expectedException Data\Exceptions\FileNotReadableException
*/
public function testFileNotReadableException() {
$file = '/_files/6504/58/6332_unreadable.xlsx';
$sut = new SUT();
$sut->readFile($file);
}
}

您甚至不必将这些文件包含在您的存储库中或担心其权限。

关于PHPUnit 和 Git : How to test with unreadable file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com