如何使用 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
  }

我的问题:

  1. 我做错了什么?
  2. 使用 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