如何使用 Bats Core 在 Bash 5 中测试格式化?
How to test formatting in Bash 5 with Bats Core?
尝试使用 Bats Core 与 Bash (5.1.16) 进行 Shell 测试。我 运行 在尝试测试格式时遇到问题,并且已经花了 2 个小时。
在此测试中,我想确保文本格式为红色。
@test "Message with title only, format 'list', style 'error'" {
run message \
--title="Message Title" \
--format="list" \
--style="error"
# echo "${lines[@]}" > foobar.sh
assert_line --index 0 -p '[31m [✖] Message Title (B[m'
}
如果我将 Bats Core 结果行转储到带有 echo "${lines[@]}" > foobar.sh
的文件中,我得到:
[31m [✖] Message Title (B[m
Whosebug 不显示转义。这是 IntelliJ
中的情况
我不明白为什么这行不通,而其他测试中的以下内容却行得通。
[[ "${output}" == "[30mHello World.(B[m How are you?" ]] # also with ESC in IntelliJ
编辑:
我假设底层代码可以工作,因为输出是正确的。但是,这里是源文件 1 中 message()
的基础代码:
# arguments and stuff here
if is_false "${no_icons:-}" && is_present "${icon:-}"; then
output_string=" [${icon}] "
unset spaces
fi
output_string="$output_string${spaces:-}${title:-}\n"
text_red "${output_string:-}"
if is_blank "${message:-}"; then
return
fi
echo "$message" | while read -r line; do
# Indirect color function call # Trim whitespaces from line beginning
text_red " $(echo -e "${line}" | sed -e 's/^[[:space:]]*//')\n"
done
这里是来自源文件 2 的着色函数:
function _print_foreground_color() {
printf "%b" "$(tput setaf "${2:-}" 2>/dev/null)" "${1:-}" "$(tput sgr0 2>/dev/null)"
}
function text_red() {
_print_foreground_color "${1:-}" 1
}
我的问题:
- 我做错了什么?
- 使用 Bats Core 测试格式化的最佳方法是什么?
如有任何帮助,我们将不胜感激!
您可以使用 printf "%q"
获取您要测试的值:
#!/usr/bin/env bash
function _print_foreground_color() {
printf "%b" "$(tput setaf "${2:-}" 2>/dev/null)" "${1:-}" "$(tput sgr0 2>/dev/null)"
}
function text_red() {
_print_foreground_color "${1:-}" 1
}
text_red alert; echo
# Output :
# alert in red
printf "%q\n" "$(text_red alert)"
# Output :
# $'\E[31malert\E(B\E[m'
if test "$(text_red alert)" = $'\E[31malert\E(B\E[m'; then
echo "Compared successfully"
fi
# Output :
# Compared successfully
尝试使用 Bats Core 与 Bash (5.1.16) 进行 Shell 测试。我 运行 在尝试测试格式时遇到问题,并且已经花了 2 个小时。
在此测试中,我想确保文本格式为红色。
@test "Message with title only, format 'list', style 'error'" {
run message \
--title="Message Title" \
--format="list" \
--style="error"
# echo "${lines[@]}" > foobar.sh
assert_line --index 0 -p '[31m [✖] Message Title (B[m'
}
如果我将 Bats Core 结果行转储到带有 echo "${lines[@]}" > foobar.sh
的文件中,我得到:
[31m [✖] Message Title (B[m
Whosebug 不显示转义。这是 IntelliJ
中的情况我不明白为什么这行不通,而其他测试中的以下内容却行得通。
[[ "${output}" == "[30mHello World.(B[m How are you?" ]] # also with ESC in IntelliJ
编辑:
我假设底层代码可以工作,因为输出是正确的。但是,这里是源文件 1 中 message()
的基础代码:
# arguments and stuff here
if is_false "${no_icons:-}" && is_present "${icon:-}"; then
output_string=" [${icon}] "
unset spaces
fi
output_string="$output_string${spaces:-}${title:-}\n"
text_red "${output_string:-}"
if is_blank "${message:-}"; then
return
fi
echo "$message" | while read -r line; do
# Indirect color function call # Trim whitespaces from line beginning
text_red " $(echo -e "${line}" | sed -e 's/^[[:space:]]*//')\n"
done
这里是来自源文件 2 的着色函数:
function _print_foreground_color() {
printf "%b" "$(tput setaf "${2:-}" 2>/dev/null)" "${1:-}" "$(tput sgr0 2>/dev/null)"
}
function text_red() {
_print_foreground_color "${1:-}" 1
}
我的问题:
- 我做错了什么?
- 使用 Bats Core 测试格式化的最佳方法是什么?
如有任何帮助,我们将不胜感激!
您可以使用 printf "%q"
获取您要测试的值:
#!/usr/bin/env bash
function _print_foreground_color() {
printf "%b" "$(tput setaf "${2:-}" 2>/dev/null)" "${1:-}" "$(tput sgr0 2>/dev/null)"
}
function text_red() {
_print_foreground_color "${1:-}" 1
}
text_red alert; echo
# Output :
# alert in red
printf "%q\n" "$(text_red alert)"
# Output :
# $'\E[31malert\E(B\E[m'
if test "$(text_red alert)" = $'\E[31malert\E(B\E[m'; then
echo "Compared successfully"
fi
# Output :
# Compared successfully