(foo; echo $?)为返回> 0 w / set -e的函数回显空字符串

时间:2015-02-11 22:51:19

标签: bash shell shunit2

我正在尝试对一些bash脚本进行单元测试。我的一个函数返回1作为假值,如果像

这样的测试,我可以使用它
foo() {
  return 0
}

if foo; then
  echo "Passed"
fi

这对编写干净的代码非常方便。

但是,当尝试使用shunit2对此代码进行单元测试时,assertFalse断言需要一个字符串值来测试。

我通过编写这样的测试来解决这个问题:

test_foo() {
  local result="$(foo; echo $?)"
  assertFalse "$result"
}

foo返回1时失败。 echo $?似乎是回显空字符串,而不是实际的返回码。

知道发生了什么事吗?

修改

只有在设置set -e时才会出现这种情况。不知道为什么。

3 个答案:

答案 0 :(得分:2)

使用set -e,子shell

(foo; echo $?)
如果foo失败,则退出

- 在这种情况下,foo返回后会立即退出 - 因此永远不会执行echo $?

作为附注,some people dislike set -e(并且有很好的理由,您可以通过阅读链接发现)。

答案 1 :(得分:0)

我知道您的测试功能应如下所示:

test_foo() {
  local result="$(foo; echo $?)"
  assertFalse "[ $result == 0 ]"
}

AssertFalse用法:

assertFalse [message] condition

您可以找到用法Here

答案 2 :(得分:-5)

试试这段代码:

if [ foo == 0 ]
then
   echo "passed"
else
   echo "error"
fi