首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >proto.Unmarshal测试不一致失败

proto.Unmarshal测试不一致失败
EN

Stack Overflow用户
提问于 2022-05-24 08:16:42
回答 1查看 339关注 0票数 2

我有一些Redis代码,它们依赖Proto标准来编组/解组数据。我编写了以下测试,使用戈梅加proto.Unmarshal进行测试

代码语言:javascript
运行
复制
b64Decoded, err := base64.StdEncoding.DecodeString("derp")
Expect(err).ShouldNot(HaveOccurred())

var item testRecord
err = proto.Unmarshal(b64Decoded, &item)
Expect(err).Should(HaveOccurred())
Expect(err.Error()).Should(Equal("proto:\u00a0cannot parse invalid wire-format data"))

但是,最后的断言失败了,因为预期的错误字符串是proto: cannot parse invalid wire-format data。这里最明显的解决办法是改变它,当我改变它时,错误就消失了。直到我修改测试并重新运行它,在这种情况下,测试再次失败,告诉我字符串应该是proto:\u00a0cannot parse invalid wire-format data。这个循环无止境地在继续。那么,我在这里做错了什么,我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-25 14:20:20

这个问题并不完全像您想象的那样;protobuf包在输出错误时随机选择一个空格或\u00a0 (我相信它是基于二进制的散列)。你可以看到这个这里

代码语言:javascript
运行
复制
// Deliberately introduce instability into the error message string to
// discourage users from performing error string comparisons.
if detrand.Bool() {
   return "proto: " // use non-breaking spaces (U+00a0)
} else {
   return "proto: " // use regular spaces (U+0020)
}

因此,您遇到的问题是故意的,目的是防止用户做您正在尝试的事情(依赖于相同的错误)。只有在更改测试时(我猜不是每次更改测试时),Go才会缓存测试结果(在默认情况下,只有在发生更改时才运行测试)。

关于你能做些什么,我首先建议考虑这个测试是否真的是必要的。包的作者明确表示错误是不稳定的,因此在发布新版本的google.golang.org/protobuf/proto时,以这种方式进行比较可能会中断。

protobuf包测试通过调用detrand.Disable() (例如这里)来解决这个问题。您不能这样做,因为google.golang.org/protobuf/internal/detrand位于internal下,因此在不可及下。

如果您真的想解决这个问题,最简单的方法可能是strings.Contains

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72359452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档