издеваться над вновь созданным экземпляром? - PullRequest
0 голосов
/ 10 сентября 2009

У меня есть старый код, который не использовал 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 () в моем тесте, но так как функция использует «новый», чтобы получить экземпляр мой фиктивный объект игнорируется, что имеет смысл

так что я вижу только 2 варианта

  1. некоторые особенности phpunit, которых я не знаю - вот почему я спрашиваю здесь ^^
  2. Мне нужно изменить старый код - который, я знаю, будет лучше

так, кто-нибудь знает ответ для варианта 1?

thx all

1 Ответ

1 голос
/ 10 сентября 2009

ВАРИАНТ 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;
    }
}

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

...