Вопрос

У меня есть старый код, который не использовал TDD Теперь я хочу написать тест для функции, которая выглядит следующим образом

function somefunction($someargs){
    // do a few checks on $someargs
    $database = new DB_PG();
    $result = $database->select($query);
    // do some changes on result
    return $result;
}

, поскольку я не очень опытен с phpunit и тестированием в целом мой вопрос: Как я могу издеваться над DB_PG? я попробовал getMock () в моем тесте, но так как функция использует " new " получить экземпляр мой фиктивный объект игнорируется, что имеет смысл

поэтому я вижу только 2 варианта

<Ол>
  • некоторые особенности phpunit, о которых я не знаю - вот почему я спрашиваю здесь ^^
  • мне нужно изменить старый код, который, я знаю, будет лучше
  • Итак, кто-нибудь знает ответ для варианта 1?

    спасибо всем

    Это было полезно?

    Решение

    ВАРИАНТ 1

    Вы можете изменить функцию так, чтобы она работала следующим образом:

    function someFunc($existingArgs, $db = null)
    {
        $db = (is_null($db)) = new DB_PG();
        $result = $db->select($query)
    
        $return $result;
    }
    

    Таким образом, вы можете передать экземпляр db, это позволит вам, по крайней мере, протестировать эту функцию, в будущем вы можете реорганизовать такие вещи, чтобы работа someFunc выполнялась на моделях, а загрузка db происходила через dao / repository / factory .

    ВАРИАНТ 2

    Если DB_PG еще не извлечен через файл require / include в файле, в котором находится эта функция, вы можете определить фиктивный класс внутри вашего тестового класса

    class DB_PG
    {
        public function select($query)
        {
            //use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
            return $mockResult;
        }
    }
    

    Таким образом, вы можете контролировать, что происходит с результатом.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top