所以我需要一种“模拟”一个函数的方法,以便我可以拦截它的调用 - 这是一个很好的方法吗?
#!/usr/bin/env bash
connect() {
echo "connecting to $1 on port $2"
}
setup() {
connect localhost 8080
}
fake_setup() {
# Save the original connection function so we can restore it later
local original_function=$(declare -f connect)
# Mock the "connect" function so that the real function is not called when
# we run the setup.
connect() {
echo "faking connection to $1 on port $2"
}
setup
eval "${original_function}"
}
# Should output "faking connection to localhost on port 8080".
fake_setup
# Should output "connecting to localhost on port 8080".
setup
有没有其他方法可以这样做?
答案 0 :(得分:2)
制作2个“包含”文件,其中包含setup()
个功能。
在脚本中获取您需要的那个(模拟的或真实的)。
对于您想要模拟的每个接口,您可以拥有普通的包含文件和模拟版本。在主文件中,您只需要确定要使用哪个版本的包含文件。
编辑:如果要从命令行引导所有内容,请尝试尽可能保持测试文件的清洁:
文件测试用例
#!/bin/bash
source environ
echo "Calling three functions"
setup
hello
db
您希望在不使用参数的情况下拨打testcase
进行嘲笑,或者testcase db
,testcase setup
或testcase setup db
。参数将由environ
包含文件处理:
文件环境
# Code that sets mocking flags
for param; do
case $param in
"hello" ) mockhello=mock;;
"setup" ) mocksetup=mock;;
"db" ) mockdb=mock;;
* ) echo "No mock supported for $param"
esac
done
if [ -n "$mockhello" ]; then
source mockhello
else
source hello
fi
if [ -n "$mocksetup" ]; then
source mocksetup
else
source setup
fi
if [ -n "$mockdb" ]; then
source mockdb
else
source db
fi
你需要一些包含真实代码和模拟代码的文件:
文件数据库
function db {
echo "Real db"
}
文件你好
function hello {
echo "Hello"
}
文件mockdb
function db {
echo "mocking db"
}
文件mockhello
function hello {
echo "Mocking hello"
}
文件mocksetup
function setup {
echo "mocking setup"
}
文件设置
function setup {
echo "setup"
}
您只需要一个chmod +x testcase
就可以了。