【发布时间】:2012-01-09 05:28:06
【问题描述】:
我是一个相对较新的单元测试转换者,我在这里遇到了一个绊脚石:
如何使用 PHP 的内置 ftp 函数测试连接到远程 FTP 服务器并在其上执行操作的代码?一些谷歌搜索为 Java (MockFtpServer) 提供了一个快速模拟选项,但 PHP 没有现成的可用选项。
我怀疑答案可能是为 PHP 的 ftp 函数创建一个包装类,该类随后可以被存根/模拟以模仿成功/不成功的 ftp 操作,但我真的很感谢比我更聪明的人的一些意见!
请注意,我一直在使用 PHPUnit,并且需要专门针对该框架的帮助。
根据@hakre 的请求,我想测试的简化代码如下所示。我本质上是在问最好的测试方法:
public function connect($conn_name, $opt=array())
{
if ($this->ping($conn_name)) {
return TRUE;
}
$r = FALSE;
try {
if ($this->conns[$conn_name] = ftp_connect($opt['host'])) {
ftp_login($this->conns[$conn_name], $opt['user'], $opt['pass']);
}
$r = TRUE;
} catch(FtpException $e) {
// there was a problem with the ftp operation and the
// custom error handler threw an exception
}
return $r;
}
更新/解决方案摘要
问题总结
我不确定如何单独测试需要与远程 FTP 服务器通信的方法。您应该如何测试是否能够连接到您无法控制的外部资源,对吧?
解决方案总结
为 FTP 操作创建一个适配器类(方法:连接、ping 等)。然后,在测试使用适配器执行 FTP 操作的其他代码时,该适配器类很容易被存根以返回特定值。
更新 2
我最近在您的测试中发现了一个使用名称空间的绝妙技巧,它允许您“模拟”PHP 的内置函数。虽然适配器在我的特定情况下是正确的方法,但在类似情况下这可能对其他人有所帮助:
【问题讨论】: