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

Unit testing 如何在功能测试中模拟文件复制,unit-testing,symfony,phpunit,symfony-2.8,Unit Testing,Symfony,Phpunit,Symfony 2.8,我有一个控制器,负责将请求传递的文件(通过正文)复制到web/images下的特定路径。路径由位于特定控制器中的属性指定 我想做的是使用功能测试对其进行测试,但我不希望它覆盖项目中的文件,因此我想在测试用例发送请求之前使用vfs或更改路径 有没有一个好的直接方法来实现这一点 一种常见的方法是加载可能在不同环境之间更改的配置作为环境变量。(我以前从未使用过symfony,因此可能有一些工具可以帮助使用env-vars) 然后,可以创建上载路径 $upload_path = getenv('WEB_

我有一个控制器,负责将请求传递的文件(通过正文)复制到
web/images
下的特定路径。路径由位于特定
控制器中的属性指定

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


有没有一个好的直接方法来实现这一点

一种常见的方法是加载可能在不同环境之间更改的配置作为环境变量。(我以前从未使用过symfony,因此可能有一些工具可以帮助使用env-vars)

然后,可以创建上载路径

$upload_path = getenv('WEB_IMAGE_UPLOAD_PATH') ? 
    getenv('WEB_IMAGE_UPLOAD_PATH') : 'web/images'
这将允许您在集成模式下启动服务器时指定temp(
/tmp
?)目录


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


我相信您可以将您的“WEB\u IMAGE\u UPLOAD\u PATH”设置为这些流之一

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

然后,在PHPUnit类中,我用路径替换对象属性的值。通过这样做,我获得了我所需要的行为,而不触及我真正的文件/路径。所有内容都将存在于虚拟文件系统中,我的对象将使用它

参数对于干净且可重用的代码来说很重要,但是当您想要进行单元测试时,参数就更重要了:我认为单元测试可以帮助我强制对所有内容进行参数化,而不是在您没有太多时间的情况下重蹈硬编码的覆辙。为了帮助我编写单元测试,我创建了一个访问方法和属性的类,不管它们的可访问性如何


我很确定已经有更复杂的东西了,但这门课正好满足了我的需要。希望对您有所帮助:-)

谢谢您的建议!最后,我找到了自己的方法,并将其记录在一个专门的答案中。请随意在下面评论“但我不希望它覆盖我项目中的文件”——这听起来像是你做错了什么。确保代码写入的目录(最初为空)仅用于此目的。您不在生产环境中运行测试,是吗?最后,如果您想测试“一个负责复制文件的控制器”,我认为最好不要模拟文件系统,而是使用一个真实的文件系统。否则,你测试什么?模拟的行为?这部分是正确的,它总是取决于你需要测试什么,让我们不要把我们的思维变成一个固执己见的解决方案:)如果控制器的职责是覆盖放置在特定路径中的文件,git跟踪原始默认文件,我想测试的是,控制器根据指定的路径替换文件,但我不希望触碰我亲爱的原始默认文件。缺少的是可以在测试和质量环境中进行测试的原始路径。但是对于TDD开发,我认为这个测试可能非常好:我正在测试行为