“嘲弄”bash功能

时间:2016-08-28 20:35:22

标签: bash shell mocking

所以我需要一种“模拟”一个函数的方法,以便我可以拦截它的调用 - 这是一个很好的方法吗?

#!/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

有没有其他方法可以这样做?

1 个答案:

答案 0 :(得分:2)

制作2个“包含”文件,其中包含setup()个功能。
在脚本中获取您需要的那个(模拟的或真实的)。

对于您想要模拟的每个接口,您可以拥有普通的包含文件和模拟版本。在主文件中,您只需要确定要使用哪个版本的包含文件。

编辑:如果要从命令行引导所有内容,请尝试尽可能保持测试文件的清洁:

文件测试用例

#!/bin/bash

source environ

echo "Calling three functions"
setup
hello
db

您希望在不使用参数的情况下拨打testcase进行嘲笑,或者testcase dbtestcase setuptestcase 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就可以了。