You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:45:43