Я пытался заставить фиктивные объекты PHPUnit работать с некоторым унаследованным кодом, над которым я работаю, но у меня возникли проблемы с его заменой для объекта, который мне нужен, и я почти уверен, что это должно быть потому, что Я использую это неправильно.
В настоящее время у нас есть класс, который используется исключительно для создания запросов, когда другой класс хочет сделать запрос, он создает объект этого класса и передает ему данные sql и базы данных. Я хочу, чтобы PHPUnit заменил этот объект фиктивной версией, которую я могу протестировать.
Однако я обнаружил, что если я создаю фиктивный объект в тестовом сценарии, тестируемый метод просто обходит его. Я предполагаю, что это связано с тем, что метод создает и затем использует объект локально, а не передает его в качестве параметра (, и в этом случае я мог бы просто сослаться на метод с фиктивным объектом, переданным в качестве параметра ). Ниже приведен пример того, как может выглядеть код:
class SampleClass{
function loadData(){
$sql = "SELECT * FROM users";
$query = new Query();
$query->query($sql);
while($row = $query->get_row()){
if($row['email'] = ''){
$this->errors[] = "Email missing from user ".$row['user_id'];
}
$result[] = $query->get_row();
}
$this->users = $result;
if(count($user->errors) >= 1){
return $user->errors;
}else{
return true;
}
}
}
class Query{
function query($sql){
$this->result = mysql_query($sql);
}
function get_row(){
return mysql_fetch_assoc($this->result);
}
}
Есть ли способ создать фиктивный объект в тестовом файле PHPUnit, который заменит объект $query в SampleClass фиктивным объектом, который я могу использовать для проверки передаваемых параметров и управления ответом?Я не смогу заменить класс запроса или изменить способ ссылки на него, поскольку он широко используется во всем нашем приложении, но я хотел бы, по крайней мере, иметь возможность создать для него некоторую форму тестовой среды. Буду признателен за любую помощь, которую вы можете оказать
Отредактировано, чтобы уточнить, что в методе loadData происходит больше, чем просто запрос, который является частью метода, который я пытаюсь протестировать. Я надеюсь добавить двойную строку метода класса запроса get _, которая вернет предварительно -заданный массив выборочных данных, с которыми метод будет работать, а не попадет в реальную базу данных