Возможно ли, чтобы PHPUnit Mock Object заменил объект, созданный в классе?

Я пытался заставить фиктивные объекты 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 _, которая вернет предварительно -заданный массив выборочных данных, с которыми метод будет работать, а не попадет в реальную базу данных

6
задан SolidSquid 10 July 2012 в 09:21
поделиться