我正在尝试对一些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
时才会出现这种情况。不知道为什么。
答案 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