为何`unicode-show`包是必需的?Haskell Hspec测试问题解析
问题
我正在使用unicode-show包来让一个Hspec测试通过:
原测试代码片段:
...(show . Data.List.NonEmpty.head $ infiles2, outFile2) `shouldBe` ("\"/foo/bar/baz - :.ogg\"", outFile1))...
测试失败结果:
expected: ("\"/foo/bar/baz - :.ogg\"", "/foo/bar/fee.m4a") but got: ("\"/foo/bar/baz - \\65306.ogg\"", "/foo/bar/fee.m4a")
改用ushow后的代码片段:
...(Text.Show.Unicode.ushow . Data.List.NonEmpty.head $ infiles2, outFile2) `shouldBe` ("\"/foo/bar/baz - :.ogg\"", outFile1))...
测试通过结果:
Test suite spec: RUNNING... ......... Finished in 0.0115 seconds 9 examples, 0 failures, 2 pending Test suite spec: PASS
请问为何必须使用unicode-show包?标准的show函数为何无法正确处理?
原因分析
标准
show的设计逻辑:Haskell标准库的show函数核心目标是生成可被Haskell代码解析还原的字符串。对于ASCII范围外的Unicode字符(比如你用到的全角冒号:,Unicode码点U+FF1A,十进制是65306),它会自动转成\XXXX的十进制转义格式。这样生成的字符串能被read函数精确还原成原字符,但视觉上不是直接显示字符本身,导致你的测试断言对比失败。unicode-show的ushow的作用:unicode-show包提供的ushow函数专门针对Unicode场景优化,它会直接输出字符的可视化形式而非转义序列,同时保证输出的字符串符合人类可读的预期,刚好匹配你测试断言里写的带全角冒号的字符串,因此测试能通过。
内容的提问来源于stack exchange,提问作者cheecheeo
相关产品推荐
相关产品推荐

