我正在使用Commander编写一个ruby gem,它使用erb模板和$terminal.color
来表示某些输出。在RSpec中编写测试时(使用CLI Test)我希望能够将一个选项传递给我的命令以防止着色,以便我的测试可以匹配简单的字符串,而不必在字符串比较中包含格式。
目前我正在使用:
execute_script('mycommand arg1')
expect(last_execution.stdout).to include("Expected Colorized Output")
但是,让我们说“Colorized”这个词是粗体,这个测试会失败,因为它被其他角色包围所以我必须像这样写我的测试
execute_script('mycommand arg1')
expect(last_execution.stdout).to include("Expected")
expect(last_execution.stdout).to include("Colorized")
expect(last_execution.stdout).to include("Output")
我想避免以这种方式分解测试 - 有没有办法可以在我的测试中通过execute_script
调用中的选项,或者配置RSpec来删除测试的格式?
RSpec看到的示例字符串
# successfully is bolded here
Command ran \e[1m\e[32msuccessfully\e[0m
我希望能够对抗
expect(last_execution.stdout).to include("Command ran successfully")
答案 0 :(得分:2)
尝试使用以下RegExp从字符串中删除ANSI转义符号:/\e\[(\d+)m/
"Command ran \e[1m\e[32msuccessfully\e[0m".gsub(/\e\[(\d+)m/, "")
=> "Command ran successfully"
RegExp来自ansi gem https://github.com/rubyworks/ansi
https://github.com/rubyworks/ansi/blob/17002348d45ce9298a1a4017dc43d3cf65151bd4/lib/ansi/code.rb#L44
我不确定这个正则表达式是否对这项工作最正确。我在这个答案中找到了另一个:How can I remove the ANSI escape sequences from a string in python
/(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]/
答案是指相应的标准,所以这个可能更完整。
答案 1 :(得分:0)
使用@ SunnyMagadan的正则表达式/\e\[\d+m/
成功定位着色。我不是必须在所有测试中都包含它,而是扩展了CliTest Execution类并添加了一个stripped_stdout
方法,该方法只使用正则表达式去除已经由类定义的stdout。
我将此代码添加到/ spec / support中的文件并将其导入我的spec_helper.rb
module CliTest
class Execution
# Strips out ansi colorization leaving unformatted text
def stripped_stdout
@stdout.gsub(/\e\[\d+m/, '')
end
end
end
这允许我在我的测试中使用以下内容
expect(last_execution.stripped_stdout).to include("Expected Colorized Output")
这是我满意的解决方案。这不会干扰任何其他功能,并允许我在/我想要的时候继续使用last_execution.stdout。