如何让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
相关产品推荐
相关产品推荐

