BATS测试中run bash -c调用函数多参传递失败且需保留assert_failure如何解决
问题根源
你的参数传递失败是两个原因共同导致的:
- 用单引号包裹了
bash -c的执行命令,单引号内的变量不会在测试用例的当前上下文展开,只会传入bash -c启动的子shell中解析,而子shell无法访问测试用例中未export的局部变量,导致变量取值为空。 - 你在
some_function调用后直接加了换行,会导致后续参数和函数名被截断,无法正常传递。
解决方案
以下两种方案都不需要导出全局变量,完全满足你的需求:
方案1:直接调用函数(推荐)
BATS的run命令原生支持直接调用当前上下文中的函数,不需要额外套bash -c,写法最简洁,也不会有变量作用域问题:
load 'libs/bats-support/load' load 'libs/bats-assert/load' load 'libs/bats-file/load' load 'assert_utils' @test "Perform some test." { variable_one="one" variable_two="two" variable_three="three" variable_four="four" # 先加载目标脚本,将函数导入当前测试上下文 source src/some_script.sh # 直接调用函数并传递参数 run some_function "$variable_one" "$variable_two" "$variable_three" assert_failure assert_output "$expected_error_message" }
每个BATS测试用例都是独立的执行环境,不会出现跨用例的变量污染问题。
方案2:子shell传递位置参数
如果你确实需要用独立子shell执行(比如要完全隔离执行环境),可以把变量作为位置参数传递给bash -c的命令串:
load 'libs/bats-support/load' load 'libs/bats-assert/load' load 'libs/bats-file/load' load 'assert_utils' @test "Perform some test." { variable_one="one" variable_two="two" variable_three="three" variable_four="four" # 下划线用来占位子shell的$0参数,后续传入的变量会按顺序对应命令串内的$1、$2、$3 run bash -c 'source src/some_script.sh && some_function "$1" "$2" "$3"' _ "$variable_one" "$variable_two" "$variable_three" assert_failure assert_output "$expected_error_message" }
内容的提问来源于stack exchange,提问作者a.t.
相关产品推荐
相关产品推荐

