如何让PHPUnit断言长字符串包含两个可选值之一?
如何用PHPUnit断言长字符串包含两个可选值之一?
嘿,我来帮你梳理这个问题~首先得明确:你尝试的$this->assertContains([$option1, $option2], $multi_kilobyte_string)写法行不通。因为PHPUnit的assertContains方法第一个参数需要的是单个搜索值,而非数组——它会尝试在字符串里查找这个数组本身,显然这和你的需求完全不符。
下面给你几种可行的解决方案,你可以根据PHP版本和实际场景选择:
方案1:用PHPUnit约束类(更贴合PHPUnit原生风格)
利用LogicalOr和StringContains约束组合,实现“或”逻辑的断言:
use PHPUnit\Framework\Constraint\LogicalOr; use PHPUnit\Framework\Constraint\StringContains; // 在测试方法内 $multi_kilobyte_string = "lorem ipsum..."; $option1 = "dolor"; $option2 = "amet"; $this->assertThat( $multi_kilobyte_string, new LogicalOr( new StringContains($option1), new StringContains($option2) ) );
方案2:原生PHP逻辑+assertTrue(更直观简洁)
如果觉得约束类写法繁琐,直接用PHP字符串判断逻辑配合assertTrue也很高效:
PHP 8.0+ 版本(使用str_contains)
$this->assertTrue( str_contains($multi_kilobyte_string, $option1) || str_contains($multi_kilobyte_string, $option2) );
PHP 8.0以下版本(使用strpos兼容)
由于str_contains是PHP8.0才引入的,低版本可以用strpos替代:
$this->assertTrue( strpos($multi_kilobyte_string, $option1) !== false || strpos($multi_kilobyte_string, $option2) !== false );
方案3:自定义辅助方法(适合高频重复场景)
如果你的测试中经常需要做“包含任意一个值”的断言,可以在测试基类里封装一个复用方法:
protected function assertContainsAny(array $needles, string $haystack): void { $found = false; foreach ($needles as $needle) { if (str_contains($haystack, $needle)) { // 低版本替换为strpos判断逻辑 $found = true; break; } } $this->assertTrue($found, "None of the provided values were found in the string"); } // 调用方式 $this->assertContainsAny([$option1, $option2], $multi_kilobyte_string);
这样后续再遇到类似需求,直接调用这个方法即可~
内容的提问来源于stack exchange,提问作者Michael Arrison
相关产品推荐
相关产品推荐

