你正在使用的Go版本是(go version
)?
$ go version
go version go1.20.2 darwin/amd64
⚠️这似乎也影响到了go1.19,但我相信在过去某个时候它是有效的
这个问题在最新版本的发布中是否重现?
是的
你正在使用什么操作系统和处理器架构(go env
)?
❌不相关,这种情况在多个环境中都发生过,包括Go Playground中的Go 1.19和Go 1.20
你做了什么?
- 提供一个可测试的例子,该函数返回包含连续换行符的输出
- 由于
testing
解析器修改了Output
注解,示例无法通过测试
最小示例
可在这里查看: https://go.dev/play/p/LFktKVr75lz
✅ ExampleFoo
函数返回包含连续换行符的数据:
Single newline:
Double newline:
Final text
✅ ExampleFoo
包含一个嵌入式Output:
注解,具有相同的预期输出:
//Output:
//Single newline:
//
//Double newline:
//
//
//Final text
✅ Output
和stdout
进行比较,删除前导和尾随空格
❌多个换行符被折叠成单个换行符,使测试失败-唯一的解决方案是修改被测试的函数(这不是一个选项)
你期望看到什么?
Output:
应该原样解析,而不是被修改(除了修剪前导和尾随空格)
你看到了什么?
多个空行被折叠成一个空行
附加上下文
进行了一些调查,看看我能否找到根本原因,但目前还没有成功
目前怀疑它隐藏在testing
包的某个地方,或者是ast
解析单行注解链的意外副作用
5条答案
按热度按时间a1o7rhls1#
可能的解决方案
testing
库在stdout
结果(也称为got:
)以及Output:
注解(也称为want:
)中折叠换行符我猜测 (1) 对人们破坏性最小,但它仍然不是最优解 - 因为它没有技术上测试输出是否正确(在某些情况下,确保输出包含多个换行符非常重要,因此测试实际上并不是测试。虽然这显然应该由单元测试覆盖 - 但仍有一个正式化的测试场景忽略了输出的有效性,这是奇怪的)
bzzcjhmw2#
2应该是前进的方向。也许它使用了新的结构化文档解析器,可以折叠换行符?
s5a0g9ez3#
CC @bcmills
8dtrkrch4#
已记录的行为是“比较忽略前导和尾随空格”,因此折叠内部换行符似乎确实不正确。
然而,
Output:
解析至少需要考虑到不同平台上的不同行尾(\n
与\r\n
)。为了尽量减少现有示例中断的数量,我认为这应该在
GODEBUG
设置上进行限制(参见#56986)。ekqde3dh5#
https://go.dev/cl/479119提到了这个问题:
go/ast: allow Example output to not reduce empty lines