如何测试字符串是否包含PHPUnit中的另一个字符串?

The*_*der 61 php phpunit

我似乎无法在PHPUnit中找到一个断言,只是测试一个字符串是否包含在另一个字符串中的某个地方.试着这样做:

public function testRecipe() {

    $plaintext = get_bread_recipe();

    $this->assertStringContains('flour', $plaintext);

}
Run Code Online (Sandbox Code Playgroud)

我会用什么真正的断言而不是assertStringContains?在这种情况下,我宁愿不必担心正则表达式,因为绝对不需要它.

这很简单,必须有一些我忽略的东西,但我无法理解!有趣的是assertStringStartsWith(),有assertStringEndsWith()!

更新:我知道strpos() !== false可以使用,但我正在寻找更清洁的东西.如果我只是使用vanilla PHP函数,那么所有断言的重点是什么......

mal*_*lte 76

您总是可以在自定义断言方法中隐藏丑陋,所以基本上我会有一个继承自phpunit测试用例的BaseTestCase类,您可以使用它来拥有自己的可重用断言库(请参阅http://xunitpatterns.com/Custom) %20Assertion.html)..(在php 5.4中你也可以使用traits,imho断言库是traits实际上很有用的案例之一).我总是在我的项目中引入很多自定义断言,通常是特定于域的.是的,有些也很难看:)好吧,我猜这就是封装的用途......其中的东西...... :)

更新: 我刚刚检查过'assertContains'和'assertNotContains'实际上也对字符串和数组(以及实现'Traversable'的任何东西)进行操作:

function test_Contains()
{
    $this->assertContains("test", "this is a test string" );
    $this->assertNotContains("tst", "this is a test string");
}
Run Code Online (Sandbox Code Playgroud)

  • 在 2015 年还好,但在 PHP 8.1 下会抛出致命错误:`TypeError: PHPUnit\Framework\Assert::assertContains(): Argument #2 ($haystack) 必须是可迭代类型,给定字符串`。我们可以迁移到assertStringContainsString。 (5认同)
  • 同意.这应该是公认的答案. (3认同)
  • 此行为已被弃用 (2认同)

Sch*_*eis 72

您可以告诉我assertContains检查数组是否包含值.

想查看字符串是否包含子字符串,最简单的查询是使用assertRegexp()

$this->assertRegexp('/flour/', $plaintext);
Run Code Online (Sandbox Code Playgroud)

您只需要添加分隔符.

如果你真的想要一个assertStringContains断言,你可以扩展PHPUnit_Framework_TestCase并创建自己的断言.

UPDATE

在最新版本的PHPUnit中,assertContains将处理字符串.

  • 更新版本的phpunit可以执行assertContains字符串. (13认同)
  • 正确的方法名是`assertRegExp` (4认同)
  • v9中的更新:assertStringContainsString或assertStringContainsStringIgnoringCase (2认同)
  • 我们可以使用PHPUnit的这些方法:assertStringContainsString()或assertStringContainsStringIgnoringCase()和assertStringNotContainsString()或assertStringNotContainsStringIgnoringCase()顺便注意,带有字符串haystacks的assertContains()已被弃用,并且在PHPUnit 9中将不再受支持。 (2认同)

Tom*_*uba 46

2019 和 PHPUnit 8.0 更新

assertContains()自 PHPUnit 8.0 起已弃用,请参阅问题 #3425


现在推荐具体方法(参见issue #3422):

$plaintext = 'I fell on the flour';
$this->assertStringContainsString('flour', $plaintext);
Run Code Online (Sandbox Code Playgroud)

提示:使用Rector 和 PHPUnit 8.0 set立即升级。