【问题标题】:PHPUnit + PHPStorm: Different errors for run/debugPHPUnit + PHPStorm:运行/调试的不同错误
【发布时间】:2014-03-06 20:08:15
【问题描述】:

我开始为我的项目进行单元测试,但遇到了困难。我有一个测试在我单独运行时运行完美。当我运行我拥有的所有测试时,它失败了:(我故意删除了其他代码和特定的类/变量/函数名称

class XYZTest extends PHPUnit_Framework_TestCase {
    public function setUp() {
        $xml = $this->createXML();
        //...
    }


    public function testWillFailUponRunAllTests() {
        $this->subject = new XYZ();
        $result = $this->subject->getHelpText();
        //assert this and that
    }
}

执行单个测试:完美运行。

执行所有测试:我收到一个我注入的类的错误。这很奇怪,所以我想调试一下测试看看发生了什么。

调试所有测试:我什至没有遇到错误,因为setUp() 已经导致此错误消息:XYZTest::setUp(): Invalid State Error

显然,这种情况既不会在我单独运行测试时发生,也不会在我以“正常”模式运行所有测试时发生。仅在调试模式下!

调试单个测试:我又得到了另一种行为:
PHPUnit_Framework_TestResult::run(): Invalid State Error' in phar://C:/xampp/php/phpunit.phar/phpunit/Framework/TestResult.php on line 668。仅当我设置断点时才会发生这种情况,例如,当我禁用它们时不会发生这种情况。似乎是一个 PHPStorm 错误。

我正在使用 PHP 5.5.9、PHPStorm 7.1.3、PHPUnit 3.7.31、xDebug v2.2.3。我没有使用任何 PHP 框架。提前感谢您的帮助!

【问题讨论】:

    标签: php phpunit phpstorm


    【解决方案1】:

    我不相信您正确地遵循了 PHPUnit 教程。 setUp() 函数在每次测试之前运行,因为每个测试都是独立运行的。因此,您需要为此编写测试。

    class XYZTest extends PHPUnit_Framework_TestCase {
        protected $xml;     // Internal Object for testing
    
        // Assume you have autoloader configured in bootstrap. If not, Require your class to test
        //require_once('YourXMLClass.php');
        public function setUp()
        {
            $this->xml = new YourXMLClass();        // Create the XML object so it exists for testing.
        }
    
        public function testXMLIsEmpty()
        {
            $this->assertNull($this->xml->subject);
        }
    
        public function testXMLSubjectSet()
        {
            $this->xml->SetSubject('Basic Text to be returned as XML subject field');
            $this->assertEquals('<subject>Basic Text to be returned as XML subject field</subject>', $this->xml->subject);
        }
    }
    

    我的测试假设您的类中有一个 SetSubject 方法,该方法将参数添加到 XML 的主题字段。即:

    public function SetSubject($SubjectText)
    {
        $this->subject = '<subject>' . $SubjectText . '</subject>';
    }
    

    【讨论】:

    • 不知道每次测试前都会执行setUp(),谢谢!我的测试看起来与您的模拟完全一样。问题是我收到错误但无法调试 - 无论XYZTest 行在PHPStorm 中中断,下一步进入/跨步将抛出“无效状态错误”并中止调试。在其自身上运行 XYZTest 仍然可以通过,没有任何错误。我会更新我的问题。
    • Steven,我发现了错误,它与 PHPStorm 的引导文件有关,似乎有一些不一致之处。此外,当 PHP 抛出错误时,PHPStorm 或 PHPUnit 似乎开始表现得很奇怪,我之前遇到过这种情况。这可能最好由开发人员解决,但感谢您提示我正确的方向。
    • @PeerBr 这个错误很有趣。我过去可以使用 NetBeans 和 PHPStorm 进行调试,但最近没有尝试过,也没有使用您列出的版本。除了 setUp(),还有一个匹配的 tearDown(),以及 PHPUnit 文档第 6 节中的 setUpBeforeClass()/tearDownAfterClasS()。
    猜你喜欢
    • 2014-05-08
    • 2013-06-19
    • 2015-10-11
    • 1970-01-01
    • 2014-11-12
    • 2014-12-28
    • 2016-05-19
    • 2018-09-02
    • 2012-11-24
    相关资源
    最近更新 更多