如何testingstring是否包含PHPUnit中的另一个string?

我似乎无法在PHPUnit中find一个断言,只是testing一个string是否包含在另一个string中的某个地方。 试图做这样的事情:

public function testRecipe() { $plaintext = get_bread_recipe(); $this->assertStringContains('flour', $plaintext); } 

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

这很简单,必须有我忽视的东西,但我不能弄明白! 有趣的是有assertStringStartsWith()assertStringEndsWith()

更新:我知道strpos() !== false可以使用,但我正在寻找更干净的东西。 如果我只是使用香草PHP函数无论如何是什么与所有的断言,然后…

正如你可以告诉assertContains是检查数组是否包含一个值。

查看string是否包含子string,最简单的查询就是使用assertRegexp()

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

你只需要添加分隔符。

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

UPDATE

在最新版本的PHPUnit中, assertContains将在string上工作。

你总是可以隐藏自定义断言方法中的丑陋,所以基本上我会有一个BaseTestCase类inheritance自phpunittesting用例,你可以使用它来拥有自己的可重用断言库(参见http://xunitpatterns.com/Custom %20Assertion.html )..(在PHP 5.4中,你也可以使用特征,imho断言库是特征实际上有用的情况之一)..我总是在我的项目中引入不less的自定义断言,通常是特定领域的。 是的,有些也是丑陋的:)好吧,我想这就是封装在那里… …其中的东西… 🙂

更新:我只是检查和'assertContains'和'assertNotContains'实际上也操作string以及数组(以及任何实现'可穿越'):

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

难道你不能只使用可用的普通PHP函数在string中执行string,然后assertEquals的输出? 当然,这不是shiny,但它的作品。

或者,你可以使用正则expression式assertThat。

这听起来像代码/testing的devise本质上是错误的,虽然从有限的angular度来看,这个例子。 为什么一个函数会返回一个未知长度的复杂string,并且string中的某个位置是“somewhere”?

在testing中,你应该能够控制你的input,所以你应该知道你的整个期望的输出string。 如果你的函数破坏了string的其他部分,只是这个断言不会告诉你。 这可能是为什么assertStringContains函数不存在。

你可以做任何事情,包括香草PHPfunction。 如果你断言你正在testing的string感兴趣的子string不会返回FALSE它将满足您的需求。

确保你正在检查FALSE,而不是评估为FALSE,如0(这是什么strpos将返回,如果被testing的string开始与给定的子string)。

从@Schleis扩展,如果你有更复杂的string,你将需要转义正则expression式:

 $this->assertRegexp('/' . preg_quote('[some $stuff]') . '/', $plaintext); 

或者用更简洁的方法把它包起来:

 public function assertStringContains($needle, $haystack) { $this->assertRegexp('/' . preg_quote($needle) . '/', $haystack); } 
 if (strpos($plaintext, 'flour') === false){ $this->fail("planintext should contain 'flour'"); }