今天想在项目中应用Cucumber进行测试,感觉不错,可惜在命令行窗口中输出的结果中文全变成了乱码,完全影响测试结果的可读性(Cucumber的强项就在此啊)。于是开始寻找解决的方法。
1、最先想到的是cucumber输出的是UTF-8编码,而且整个Rails站点的环境也都是UTF-8了,输出到DOS命令行,显然会出现中文乱码。
于是Google到http://www.iteye.com/topic/120172,里面提出的解决方法是使用 chcp 65001修改cmd的内码页为Unicode。直接输入unicode没问题了,可惜这种方式执行ruby代码会出现Bad file descripto错误!其原因大致是出在ruby端了。
无奈只能另寻他路。
2、换一种思路,考虑到ruby的动态特性,想到覆盖Kernel中的print和puts方法,将输出的内容转换为GB2312,再输出岂不解决问题?
于是翻阅cucumber的代码,发现此为正解,而且cucumber已经考虑到这种情况,有文件cucumber-0.1.16\lib\cucumber\formatters\unicode.rb为证。
可惜很遗憾,cucumber中考虑到需要转换的内码从1251到1252(WinLatin1),没有考虑到中文windows中内码代码为936,因此转换UTF-8输出内容的功能没有启用。另外是不是把936加上就解决问题了呢?测试过好像不行,原因就没深究了。
codepages = (1251..1252)
if codepages.include?(codepage)
Cucumber::CODEPAGE = “cp#{codepage}“
..
最终的解决方法是讲unicode.rb修改至如下:
# Require this file if you need Unicode support.
require ‘cucumber/platform’
require ‘cucumber/formatters/ansicolor’
$KCODE=’u’ unless Cucumber::RUBY_1_9
#if Cucumber::WINDOWS_MRI && `chcp` =~ /Active code page: (\d+)/
#codepage = $1.to_i
#codepages = (1251..1252)
#if codepages.include?(codepage)
Cucumber::CODEPAGE = “GB2312″ #强制将输出内码为GB2312
require ‘iconv’
module Kernel
alias cucumber_print print
def print(*a)
begin
cucumber_print *Iconv.iconv(Cucumber::CODEPAGE, “UTF-8″, *a)
rescue Iconv::IllegalSequence
cucumber_print(*a)
end
end
alias cucumber_puts puts
def puts(*a)
begin
cucumber_puts *Iconv.iconv(Cucumber::CODEPAGE, “UTF-8″, *a)
rescue Iconv::IllegalSequence
cucumber_puts(*a)
end
end
end
#end
#end
解决Cucumber测试结果中文乱码问题
最新推荐文章于 2016-09-10 17:21:53 发布