#unit-testing #phpunit #mockery
Вопрос:
У меня есть очень интересный тестовый сценарий..
В основе системы, работающей с потоками, лежит неклассовая функция. Чтобы добавить модульный тест к этой функции, мне нужно, чтобы эта функция работала и имитировала классы, которые она включает.
Функция выглядит так:
include_once(__DIR__."/../core/debug.php");
...(A lot of include_once)
/*
* Run Task
* This is a PHP script that is ran from the command line.
* It runs the entire time
*/
ini_set("serialize_precision", -1);
$settings = settings::getInstance();
$settings->load("main");
new debug();
$db = db::getInstance();
$db->connect();
$mongo = mongo::getInstance();
$mongo->connect();
putenv("RUNNING_AS_CLI=1");
publishLog::notice("RunTask","Starting command line publish tasks");
putenv("GRACEFULL_EXIT=0");
function gracefullExit($signo, $signinfo){
echo "Executing gracefull exit... n";
putenv("GRACEFULL_EXIT=1");
}
pcntl_async_signals(true);
pcntl_signal(SIGTERM, "gracefullExit");
pcntl_signal(SIGINT, "gracefullExit");
pcntl_signal(SIGHUP, "gracefullExit");
pcntl_signal(SIGQUIT, "gracefullExit");
pcntl_signal(SIGABRT, "gracefullExit");
$stackCounter = 0;
while(true) {
try {
// Run task
publishJobEngine::runTask();
} catch (Exception $e) {
error_log($e);
}
if (getenv("GRACEFULL_EXIT") == "1"){
echo "Exiting now...n";
exit(0);
}
// Sleep 300ms
usleep( 300 * 1000 );
$stackCounter ;
if ($stackCounter > 1000){
// If we runned this more than 1000 times (5 minutes if the thread is idle) restart this thread
exit(0);
}
}
Это несколько сложная система. Есть идеи, как я могу протестировать такую функцию?