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