为什么我会得到;BORKED—清洁—第节;在PHPUnit中使用PHPT?

为什么我会得到;BORKED—清洁—第节;在PHPUnit中使用PHPT?,php,phpunit,phpt,Php,Phpunit,Phpt,我有一些PHPT测试正在PHPUnit中运行。这些测试包括一个--CLEAN--部分,用于删除测试期间创建的文件。使用pear run tests在命令行上运行PHPT测试工作正常,但是当它们通过PHPUnit运行时,我会得到以下错误: 博克——干净——节!输出: X-Powered-By:PHP/5.3.10-1ubuntu3.2 内容类型:text/html 这显然看起来像一个HTTP头,但没有进一步的文本,并且clean部分中的操作仍然按计划工作。删除CLEAN部分可以解决问题,但我不希望

我有一些PHPT测试正在PHPUnit中运行。这些测试包括一个
--CLEAN--
部分,用于删除测试期间创建的文件。使用
pear run tests
在命令行上运行PHPT测试工作正常,但是当它们通过PHPUnit运行时,我会得到以下错误:

博克——干净——节!输出:
X-Powered-By:PHP/5.3.10-1ubuntu3.2
内容类型:text/html

这显然看起来像一个HTTP头,但没有进一步的文本,并且clean部分中的操作仍然按计划工作。删除CLEAN部分可以解决问题,但我不希望在PHPT文件之外进行测试清理。有没有关于这些是由什么引起的,以及如何消除它们的想法?他们没有打破测试,但他们的输出看起来不整洁

PHPT测试(POST文件数据被截断以保护我的工作):

——测试--
测试文件上传
--未加工后--
内容类型:多部分/表单数据;边界=------------------------------------168481652011378167832091260413
内容长度:3510
-----------------------------168481652011378167832091260413
内容配置:表单数据;name=“code”
te
-----------------------------168481652011378167832091260413
内容配置:表单数据;name=“name”
测试
-----------------------------168481652011378167832091260413
内容配置:表单数据;name=“file”;filename=“test.xml”
内容类型:text/xml
-----------------------------168481652011378167832091260413--
--文件--
--干净的--
--期待--
字符串(12)“testname.xml”
布尔(真)
Zend/PHPUnit测试包装器:

<?php
require_once 'PHPUnit/Extensions/PhptTestCase.php';
/**
 * UploadFileHandleTest
 * 
 * PHPUnit wrapper for the phpt test file UploadFileHandleTest.phpt
 *
 */
class My_File_UploadFileHandle extends PHPUnit_Extensions_PhptTestCase
{
    /**
     * Test file uploads
     * 
     * Test the file uploads using associated .phpt test files. These test have to 
     * be abstracted to the php-cgi environment to permit accurate manipulation of 
     * the $_FILES superglobal. 
     * 
     * @see http://qafoo.com/blog/013_testing_file_uploads_with_php.html
     * 
     * @covers My_File_Upload::handleFile
     * 
     * @return void
     */
    public function __construct() 
    { 
        parent::__construct(__DIR__ . '/UploadFileHandleTest.phpt'); 
    }

    /**
     * Implement missing hasOutput method for PHPUnit
     * 
     * @return boolean 
     */
    public function hasOutput()
    {
        return false;
    }
}

这是由于使用PHP CGI可执行文件而不是CLI版本来运行测试造成的。CGI二进制文件将在响应前面附加两个头,如果在--CLEAN--部分中运行的代码提供了输出,那么用于测试的PEAR模块将尖叫bork-bork和血腥谋杀。将测试指向正确的PHP二进制文件,问题就会消失

:~$ echo "" | php5-cgi
X-Powered-By: PHP/5.3.10-1ubuntu3.2
Content-type: text/html

更新:这是由PEAR_RunTest中的一个错误引起的,在运行--CLEAN--部分时,它没有重置要使用的解释器。我已经提交了该问题的PR。

内容长度:3510
和请求正文之间应该有一个双CRLF(即添加一个额外的空行)。不知道这是否能解决问题,但这肯定是个问题。还要验证
3510
是否是消息正文的正确字节长度-它看起来不像是基于您发布的数据。谢谢您的回答,我会试一试。在本例中,发布的文件数据已被截断以保护IP,因此长度应正确。它是从Firefox中的一个正版标题中获取的。在内容长度后添加一行并没有什么不同。测试确实正常运行,这似乎是事后才想到的。我认为这与--CLEAN--部分路径中的所有
/..
有关。
testname.xml
确实在清理过程中被删除了吗?是的,实际的清理操作执行得很好。当我建议在
--clean--
部分中删除
?>
标记后的空格时,我正是这么想的。问题是,我怀疑,当你使用
--POST_RAW--
部分时,它会自动使用CGI二进制文件()-我不知道这是否也适用于
--CLEAN--
部分中的代码,但如果是这样的话,人们可能无法阻止这一点(在这种情况下,我会称之为bug)。但是肯定+1-这个答案确定了问题所在,但我不知道是否有解决方案……我的印象是,当使用
--POST\u RAW--
时,您必须在CGI下运行,或者没有应用标题,但我很乐意尝试一下。如何强制PHPUnit以CLI的形式运行测试?这是PEAR_RunTest中的一个bug。我已经更新了我的答案,并添加了一个链接,链接到PEAR中的bug修复请求。如果在运行测试时不需要头文件(-q到php cgi抑制头文件),则可以在$options数组中提供一个“cgi”值。
<?php

require_once 'UploadFileExists.php';
require_once 'UploadFileHandle.php';
require_once 'UploadFileHandleNoName.php';
require_once 'UploadFileHandleExceptions.php';

class My_File_UploadTestSuite extends PHPUnit_Framework_TestSuite
{
    public static function suite()
    {
        $suite = new My_File_UploadTestSuite('My_File_UploadFileTests');

        $suite->addTest(new My_File_UploadFileExists());
        $suite->addTest(new My_File_UploadFileHandle());
        $suite->addTest(new My_File_UploadFileHandleNoName());
        $suite->addTest(new My_File_UploadFileHandleExceptions());

        return $suite;
    }
}
:~$ echo "" | php5-cgi
X-Powered-By: PHP/5.3.10-1ubuntu3.2
Content-type: text/html