2013-03-15 73 views
4

我知道如何用PHPUnit库测试php输出,使用expectOutputString()expectOutputString()。现在我需要确保输出不包含给定的字符串。我可以使用输出缓冲和搜索内部字符串来做到这一点,但可能更好的方法是使用expectOutputString()以及正确的表达式。测试输出不包含文本

该表达式应该如何构建?

回答

3

你想要使用正则表达式,并做一个否定匹配,你必须使用lookahead断言语法。例如。测试的输出不包含“你好”:

class OutputRegexTest extends PHPUnit_Framework_TestCase 
{ 
    private $regex='/^((?!Hello).)*$/s'; 

    public function testExpectNoHelloAtFrontFails() 
    { 
     $this->expectOutputRegex($this->regex); 
     echo "Hello World!\nAnother sentence\nAnd more!"; 
    } 

    public function testExpectNoHelloInMiddleFails() 
    { 
     $this->expectOutputRegex($this->regex); 
     echo "This is Hello World!\nAnother sentence\nAnd more!"; 
    } 

    public function testExpectNoHelloAtEndFails() 
    { 
     $this->expectOutputRegex($this->regex); 
     echo "A final Hello"; 
    } 

    public function testExpectNoHello() 
    { 
     $this->expectOutputRegex($this->regex); 
     echo "What a strange world!\nAnother sentence\nAnd more!"; 
    } 
} 

给出了这样的输出:

$ phpunit testOutputRegex.php 
PHPUnit 3.6.12 by Sebastian Bergmann. 

FFF. 

Time: 0 seconds, Memory: 4.25Mb 

There were 3 failures: 

1) OutputRegexTest::testExpectNoHelloAtFrontFails 
Failed asserting that 'Hello World! 
Another sentence 
And more!' matches PCRE pattern "/^((?!Hello).)*$/s". 


2) OutputRegexTest::testExpectNoHelloInMiddleFails 
Failed asserting that 'This is Hello World! 
Another sentence 
And more!' matches PCRE pattern "/^((?!Hello).)*$/s". 


3) OutputRegexTest::testExpectNoHelloAtEndFails 
Failed asserting that 'A final Hello' matches PCRE pattern "/^((?!Hello).)*$/s". 


FAILURES! 
Tests: 4, Assertions: 4, Failures: 3. 
+0

不幸的是,这似乎不是多工作。请使用'回声'多么奇怪的世界!\ n新语句';'testExpectNoHello()''里面' – koral 2013-03-18 09:05:09

+0

@koral啊哈,你需要在正则表达式中的's'标志。我编辑了我的答案,因为这通常是你想要的。 – 2013-03-18 10:01:03

+0

'echo“什么你好一个奇怪的世界!\ n”;'不会给我失败:( – koral 2013-03-18 10:34:52