2009-09-10 2 views
0

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

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

поскольку им не очень expirienced с PHPUnit и тестирования в целом мой вопрос: хау Могу ли я издеваться над DB_PG? я попытался getMock() в моем тесте, но так как функция использует «новый», чтобы получить экземпляр мой фиктивный объект игнорируется, что имеет смысл

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

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

так, кто знает ответ на вариант 1?

ТНХ все

+0

Как вы настраиваете этот тест? Вы читали эту статью по двойным экзаменам? Является ли это автономной функцией или это метод, который является частью более широкого класса? Как выглядят ваши тесты (используя getMock)? –

+0

* Что вы подразумеваете под настройкой? * Да, я знаю эту статью, но я не уверен, что вы здесь делаете? * его автономной функции я хочу проверить и тест это попытаться запустить выглядит следующим образом функция test_someFunctionFailed() {$ pgmock = $ this-> getMock ('DB_PG', массив ('выбрать')); $ pgmock-> ожидает ($ this-> any()) -> метод ('select') -> will ($ this-> returnValue (null)) $ rval = somefunction(); $ this-> assertNull ($ rval); } В настоящее время это приводит к Неустранимая ошибка: вызов неопределенного метода DB_PG :: select() in ... –

ответ

1

ВАРИАНТ 1

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

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

    $return $result; 
} 

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

ВАРИАНТ 2

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

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; 
    } 
} 

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