2016-08-14 54 views
3

我有一个控制器,其职责是将与请求一起传递的文件(通过正文POST)复制到web/images下的特定路径。路径由生活在特定的Controller中的物业指定。如何在功能测试中模拟文件副本

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

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

+0

*“但我不希望它覆盖我的项目中的文件”* - 这听起来像你做错了什么。确保代码写入仅用于此目的的目录(最初为空)。而且你不在生产环境中运行测试,是吗?最后,如果你想测试*“控制器的职责是复制文件”*我认为最好不要模拟文件系统,而是使用真正的文件系统。否则,你测试什么?模拟的行为? – axiac

+0

这部分是真的,它总是取决于你需要测试什么,让我们不要把我们的思想转变成一个自以为是的解决方案:) 如果控制器的职责是覆盖放置在特定路径中的文件,并且git追踪原始默认文件,我想测试的是*控制器根据指定的路径替换文件*,但我希望亲爱的旧原始默认文件不被触及。缺少的是可以在测试和质量环境中进行测试的原始路径。但是对于TDD开发,我认为这个测试可能还不错:我正在测试行为 – Bertuz

回答

0

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

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

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

PHPUnitUtils

我肯定有已经一些更复杂的,但这个类fullfills我在这个非常时刻需要。希望它有助于:-)

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”是那些流的一个

+0

谢谢你的建议!最后我找到了自己的方式,并将其记录在一个专门的答案中。随时在下面发表评论 – Bertuz

相关问题