PHPUnit — процедурный код необходимо включать несколько раз

В настоящее время я пытаюсь создать набор тестов phpunit для тестирования кода ajax, который написан процедурно. Я не могу редактировать исходный код, fooBar.php, поскольку это может вызвать проблемы в другом месте. Проблема возникает, когда я пытаюсь запустить файл php несколько раз с разными параметрами; в коде есть функция, которая вызывает повторное объявление исключений. Ниже приведен пример того, с чем я имею дело.

fooBar.php — файл php попал под вызов ajax

$foo = $_POST['bar'];

function randomFunctionName(){
    echo "randomFunctionName";
}

if($foo == "fooBar"){
     $jsonResponse = array('success'=>true);
}else{
     $jsonResponse = array('success'=>false);
}

echo json_encode($jsonResponse);

fooBarTest.php — тестовый файл phpunit

class fooBarTest extends \PHPUnit\Framework\TestCase
{   

   private function _execute() {
       ob_start();
       require 'fooBar.php';
       return ob_get_clean();
   }    

   public function testFooBarSuccess(){
       $_POST['bar'] = "fooBar";

       $response = $this->_execute();
       $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'true') !== false));

   }        
   public function testFooBarFailure(){
       $_POST['bar'] = "notFooBar";

       $response = $this->_execute();
       $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'false') !== false));

   }

Итак, когда я запускаю этот тест, я получаю следующую ошибку

PHP Fatal error:  Cannot redeclare randomFunctionName() (previously declared in.......

Проблема возникает из-за того, что технически fooBar.php уже существует, когда выполняется второй тест, testFooBarFailure(). Однако, как видите, мне нужно перезапустить fooBar.php, чтобы получить новый ответ.

Есть ли способ удалить fooBar.php из стека/памяти php, чтобы я мог запустить его снова, как если бы он никогда не загружался из первого теста? Я попытался вытащить вторую тестовую функцию в свой собственный тестовый класс, но когда я запускаю набор тестов в целом, я получаю ту же самую ошибку.


person John K    schedule 14.09.2017    source источник


Ответы (2)


Поэтому я нашел способ сделать то, что искал. Короче говоря, я использую CURL для доступа к файлу ajax. Это позволяет мне обращаться к файлу несколько раз в моем тесте, не вызывая проблем с повторным объявлением. Ниже приведен пример моего решения для файла fooBarTest.php.

class fooBarTest extends \PHPUnit\Framework\TestCase
{   

   public function testFooBarSuccess(){
       $postData = array('bar'=>"fooBar");

       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_POST, true);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 

       $response = curl_exec($ch);      
       curl_close($ch);

       $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'true') !== false));

   }        
   public function testFooBarFailure(){
       $postData = array('bar'=>"notFooBar");

       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_POST, true);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 

       $response = curl_exec($ch);      
       curl_close($ch);

       $this->assertTrue((strpos($response, 'success') !== false) && (strpos($response, 'false') !== false));

    }
}
person John K    schedule 15.09.2017

PHP имеет встроенную функцию для проверки того, определена ли конкретная функция, она называется function_exists< /а>. Пример:

if (false === function_exists('randomFunctionName')) {
    function randomFunctionName()
    {
        echo "randomFunctionName";
    }
}

Благодаря этому вы можете много раз include/require файл, но функция будет загружена один раз.

Второй способ - просто импортировать fooBar.php один раз, используя require_once вместо require (Разница между require, include и require_once?).

person Grzegorz Gajda    schedule 14.09.2017
comment
Ни одно из ваших предложений не сработает. Проверка существования функции изменяет исходный файл fooBar.php. Как я уже сказал, я не могу изменить исходный код. В тестовом файле PHPUnit мне нужно перезагрузить файл, чтобы отправить ему новую информацию. Требование или включение его один раз не позволяет мне сделать это. - person John K; 15.09.2017