如何在功能测试中模拟文件副本

时间:2016-08-14 15:58:39

标签: unit-testing symfony phpunit symfony-2.8

我有一个控制器,责任是将与请求一起传递的文件(通过正文POST)复制到web/images下的特定路径。路径由生活在特定Controller中的属性指定。

我想要做的是使用功能测试进行测试,但我不希望它覆盖我项目中的文件,所以我想使用vfs或在我的测试用例发送请求之前更改路径。

有没有一个很好的直接方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

常见的方法是将可能在环境之间更改的配置加载为环境变量。 (我以前从未使用过symfony,所以可能有工具来帮助env变种)

上传路径可以是

$upload_path = getenv('WEB_IMAGE_UPLOAD_PATH') ? 
    getenv('WEB_IMAGE_UPLOAD_PATH') : 'web/images'

这将允许您在集成模式下启动服务器时指定临时(/tmp?)目录。

很酷,(免责声明:我不是一个php人)看起来php有IO流可能有助于功能测试,并且可以轻松清理。

http://php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-unknown-unknown-descriptios

我相信你可以设置你的WEB_IMAGE_UPLOAD_PATH'成为其中一个流

答案 1 :(得分:0)

我会尝试自己回答:我重构了我的代码,以便拥有一个属性来指定我想要复制/覆盖我的文件的路径。

然后,在PHPUnit类中,我用vfsStream路径替换object属性的值。通过这样做我得到我需要的行为,而不触及我的真实文件/路径。一切都将存在于虚拟文件系统中,我的对象将使用它。

参数对于干净且可重复使用的代码很重要,但是当你想进行单元测试时更是如此:我认为单元测试可以帮助我强制参数化所有内容,而不是在你没有那么多时重新编写硬编码时间。为了帮助我编写单元测试,我创建了一个访问方法和属性的类,而不管它们的可访问性。

PHPUnitUtils

我很确定已经有了更复杂的东西,但是这一课在这一刻充满了我的需求。希望它有所帮助: - )