PHPUnit-需要多次包含的程序代码

PHPUnit-需要多次包含的程序代码,php,phpunit,procedural,Php,Phpunit,Procedural,我目前正试图构建一个phpunit测试套件来测试一些按程序编写的ajax代码我无法编辑原始代码,fooBar.php,因为它可能会在其他地方引起问题。当我试图用不同的参数多次运行一个php文件时,就会出现这个问题;该代码有一个抛出重新声明异常的函数。下面是我正在处理的一个例子 fooBar.php-用ajax调用命中php文件 $foo = $_POST['bar']; function randomFunctionName(){ echo "randomFunctionName";

我目前正试图构建一个phpunit测试套件来测试一些按程序编写的ajax代码我无法编辑原始代码,fooBar.php,因为它可能会在其他地方引起问题。当我试图用不同的参数多次运行一个php文件时,就会出现这个问题;该代码有一个抛出重新声明异常的函数。下面是我正在处理的一个例子

fooBar.php-用ajax调用命中php文件

$foo = $_POST['bar'];

function randomFunctionName(){
    echo "randomFunctionName";
}

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

echo json_encode($jsonResponse);
foobertest.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.......
问题在于,当运行第二个测试testFooBarFailure()时,fooBar.php在技术上已经存在。如您所见,我需要重新运行fooBar.php以获得新的响应


有没有办法从php堆栈/内存中删除fooBar.php,这样我就可以再次运行它,就好像它从未从第一次测试中加载过一样?我曾尝试将第二个测试函数拉入它自己的测试类中,但当我作为一个整体运行testsuite时,我得到了相同的错误。

PHP有内置函数来检查特定函数是否已定义,它被调用。例如:

if (false === function_exists('randomFunctionName')) {
    function randomFunctionName()
    {
        echo "randomFunctionName";
    }
}
由于这一点,您可以多次
包含
/
要求
文件,但函数将加载一次


第二种方法是使用
require\u once
而不是
require
()一次性导入
fooBar.php

所以我找到了一种方法来完成我想要的任务。长话短说,我使用CURL访问ajax文件。这允许我在测试中多次点击该文件,而不会导致任何重新声明问题。下面是我针对foobertest.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));

    }
}

你的两个建议都行不通。检查该函数是否存在会改变原来的fooBar.php。正如我所说的,我无法更改原始代码。在PHPUnit测试文件中,我必须重新加载该文件以向其发送新信息。要求或包含一次都不允许我这样做。