如何在功能测试中模拟文件复制

how to mock file copy in a functional test

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

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

有什么直接的方法可以做到这一点吗?

一种常见的方法是加载可能在不同环境之间发生变化的配置作为环境变量。 (我以前从未使用过 symfony,所以可能有一些工具可以帮助处理环境变量)

上传路径可以是

$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' 设置为这些流之一

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

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

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

PHPUnitUtils

我很确定已经有更复杂的东西了,但是这个 class 满足了我此刻的需求。希望对您有所帮助:-)