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

2022-08-30 07:46:55

我似乎无法在PHPUnit中找到一个断言,它只是测试一个字符串是否包含在另一个字符串中的某个地方。尝试执行如下操作:

public function testRecipe() {

    $plaintext = get_bread_recipe();

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

}

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

它是如此简单,一定有我忽略了一些东西,但我就是想不通!有趣的是,有和!assertStringStartsWith()assertStringEndsWith()

更新:我知道可以使用,但我正在寻找更干净的东西。如果我只是使用vanilla PHP函数,那么所有断言的全部意义是什么......strpos() !== false


答案 1

正如您可以告诉的那样,用于检查数组是否包含值。assertContains

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

$this->assertRegexp('/flour/', $plaintext);

您只需要添加分隔符即可。

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

更新

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


答案 2

你总是可以在自定义断言方法中隐藏丑陋,所以基本上我会有一个BaseTestCase类,它继承自phpunit测试用例,你可以用它来拥有自己的可重用断言库(参见 http://xunitpatterns.com/Custom%20Assertion.html)。(在 php 5.4 中,你也可以使用特征,恕我直言,断言库是特征实际上有用的情况之一)。我总是在我的项目中引入相当多的自定义断言,通常是特定于域的。是的,有些也很丑陋:)好吧,我想这就是封装的目的...在事物中...:)

更新:我刚刚检查了“assertContains”和“assertNotContains”实际上也对字符串和数组(以及实现“可遍历”的任何内容)进行操作:

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

推荐