У меня был способ, который открыл соединение сокета, использовал, а затем закрыл его. Чтобы сделать его пригодным для тестирования, я переместил дело с подключением к отдельным методам (см. Код ниже).Как подделать ресурс для модульного теста в PHP?
Теперь я хочу написать единичный тест для barIntrefaceMethod()
и вам нужно высмеять метод openConnection()
. Другими словами, мне нужна подделка resource
.
Можно ли/Как «вручную» создать переменную типа resource
в PHP (для того, чтобы поддельные ручки, как «opened files, database connections, image canvas areas and the like» и т.д.)?
FooClass
class FooClass
{
public function barIntrefaceMethod()
{
$connection = $this->openConnection();
fwrite($connection, 'some data');
$response = '';
while (!feof($connection)) {
$response .= fgets($connection, 128);
}
return $response;
$this->closeConnection($connection);
}
protected function openConnection()
{
$errno = 0;
$errstr = null;
$connection = fsockopen($this->host, $this->port, $errno, $errstr);
if (!$connection) {
// TODO Use a specific exception!
throw new Exception('Connection failed!' . ' ' . $errno . ' ' . $errstr);
}
return $connection;
}
protected function closeConnection(resource $handle)
{
return fclose($handle);
}
}
Я не уверен, что вы идете по этому правильному пути. Если вы правильно поняли, вы действительно хотите протестировать PHP, встроенный в методы (fwrite, feof и т. Д.), Против объекта focked/fake resource, возвращаемого из '$ resource-> openConnection()'. Вместо этого вы должны рассмотреть объект-обертку вокруг этих методов, чтобы вы могли тестировать '$ resource-> write ('something')' вместо 'fwrite ($ resource, 'something')'. –
Спасибо за ваш комментарий! Нет, конечно, я не буду тестировать собственные функции. И, да, я создал методы, которые обертывают связанные параметры соединения, связанные с функциями PHP. Но теперь я хочу высмеять их результат для тестирования 'barIntrefaceMethod()', который вызывает эти функции переноса. Проблема только в том, что я не нашел способа подделать ['resource'] (http://php.net/manual/en/language.types.resource.php). Это расстраивает насмешку над 'openConnection()'. – automatix
Я знаю, что вы не будете тестировать собственные функции, но вы должны называть их в своем коде, и они зависят от дескриптора реального ресурса. Самый простой и продуманный способ сделать это - иметь объект, обернутый вокруг собственных функций, и вместо этого высмеять * это *. Я отправлю ответ, чтобы объяснить, что я имею в виду лучше в коде. –