Как провести модульное тестирование базовой функции?

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

Это несколько сложная система. Есть идеи, как я могу протестировать такую функцию?