Я относительно недавно перешел на юнит-тестирование в целом, и тут я наткнулся на камень преткновения:
Как мне протестировать код, который подключается к удаленному FTP-серверу и выполняет операции на нем, используя PHPвстроенные функции ftp?Некоторый поиск в Google включил опцию быстрого макета для Java ( MockFtpServer ), но для PHP ничего не доступно.
У меня есть подозрение, что ответом может быть создание класса-оболочки для PHP-функций PHPкоторый впоследствии может быть вставлен в тупик / подделан, чтобы имитировать успешные / неудачные операции 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(методы: подключение, пинг и т. д.).Этот класс адаптера затем легко заглушается, чтобы возвращать определенные значения при тестировании другого кода, который использует адаптер для выполнения операций FTP.
ОБНОВЛЕНИЕ 2
Недавно я наткнулся на отличныйтрюк с использованием пространств имен в ваших тестах, который позволяет вам «насмехаться» над встроенными функциями PHP.Несмотря на то, что адаптер был правильным решением для моего конкретного случая, это может быть полезно для других в подобных ситуациях:
Пересмотр глобальных функций php для модульного тестирования