издеваться над вновь созданным экземпляром?
-
05-07-2019 - |
Вопрос
У меня есть старый код, который не использовал 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 варианта
<Ол>Итак, кто-нибудь знает ответ для варианта 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;
}
}
Таким образом, вы можете контролировать, что происходит с результатом.