亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

proto.Unmarshal 測試不一致地失敗

proto.Unmarshal 測試不一致地失敗

Go
www說 2022-12-19 10:41:38
我有一些 Redis 代碼依賴于 Proto 標準來編組/解組數據。我使用gomega編寫了以下測試來測試proto.Unmarshal:b64Decoded, err := base64.StdEncoding.DecodeString("derp")Expect(err).ShouldNot(HaveOccurred())var item testRecorderr = 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。這個循環無限繼續下去。那么,我在這里做錯了什么以及如何解決這個問題?
查看完整描述

1 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

這個問題跟你想的不太一樣;該protobuf包隨機選擇一個空格或\u00a0在輸出錯誤時(我相信它基于二進制的哈希)。你可以在這里看到這個:

// 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)來解決這個問題。您不能這樣做,因為is under and, as such, not accessible。detrand.Disable()google.golang.org/protobuf/internal/detrandinternal

如果您真的想解決這個問題,最簡單的方法可能是strings.Contains。


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 625 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號