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

如何让stretchr/testify的assert.Contains忽略大小写与空白?或自定义断言?

自定义NormalizedContains断言的实现方案

你完全可以通过封装自定义断言函数解决重复处理字符串的问题,以下是具体实现步骤:

1. 编写字符串规范化工具函数

先实现一个统一处理字符串的函数,完成转小写、合并连续空白(含首尾)的操作:

import "strings"

func normalizeString(s string) string {
    // 转小写后,用Fields分割所有空白字符,再用单个空格拼接
    return strings.Join(strings.Fields(strings.ToLower(s)), " ")
}

strings.Fields会自动将任意连续空白字符(空格、制表符、换行等)分割为字符串切片,同时去除首尾空白,再用单个空格拼接就能得到格式统一的字符串。

2. 封装自定义断言函数

基于testify/assert库,封装你的NormalizedContains断言:

import (
    "github.com/stretchr/testify/assert"
    "testing"
)

func NormalizedContains(t testing.TB, s, substr string, msgAndArgs ...interface{}) bool {
    t.Helper() // 确保测试错误指向调用处而非函数内部
    normalizedS := normalizeString(s)
    normalizedSubstr := normalizeString(substr)
    return assert.Contains(t, normalizedS, normalizedSubstr, msgAndArgs...)
}

3. 测试中直接使用

之后在测试代码里直接调用这个自定义断言即可,无需再手动处理字符串:

func TestSample(t *testing.T) {
    // 原测试场景会返回true
    NormalizedContains(t, "HELLO     WORLD", "hello world")
    // 其他复杂空白场景也能适配
    NormalizedContains(t, "  Go\nIS\tAWESOME  ", "go is awesome")
}

如果你不需要处理除空格外的其他空白符,也可以把规范化函数改成仅替换多空格为单空格的版本,但上面的实现通用性更强。

内容的提问来源于stack exchange,提问作者cxc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:48:39