7

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

这个表达式应该如何构建?

4

2 回答 2

5

您想使用正则表达式,并且要进行否定匹配,您必须使用前瞻断言语法。例如,测试输出不包含“hello”:

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.
于 2013-03-17T06:28:50.453 回答
3

这很简单。测试该字符串不包含其他字符串:

编辑

2020 年为 PHPUnit 9.x 提供了另一种简洁的方法:

$this->assertStringNotContainsString(needle, haystack);

请参阅 PHPUnit断言文档。并非所有可用的断言都记录在文档中。

找到这些的好方法是dd($this)(或var_dump($this))从您的 PHPUnit 测试类中并滚动浏览输出methods部分。在那里,您可以看到可用的断言,包括未记录的断言。

较旧的答案

更详细、更灵活的不同断言不仅适用于字符串。

$string='just some string'; 
$this->assertThat($string, $this->logicalNot($this->stringContains('script')));
// Assertion is passed.

基于来自http://www.kreamer.org/phpunit-cookbook/1.0/assertions/use-multiple-assertions-in-one-test的同一测试中多个断言的绝佳示例

我用它来检查表单字段的清理是否正常。

在 PHPUnit 测试中,我建立了一个测试数组,<script>其中包含要清理的标签。将其传递给正在测试的消毒方法。序列化清理结果(以避免弄乱断言数组,并且在var_dump序列化结果时更容易让我看到)。

然后如上所示stringContains在断言中应用该方法并享受:)assertThat

于 2018-06-04T05:18:50.917 回答