2016-08-28 3 views
0

Итак, мне нужен способ «издеваться» над функцией, чтобы я мог перехватить ее вызов - это хороший способ сделать это?«Mocking» bash function

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

Есть ли альтернативы для этого?

ответ

2

сделать 2 "включить" файлы, как с функцией setup().
Источник того, который вам нужен в вашем скрипте (издевательство или один).

Для каждого интерфейса, который вы хотели бы высмеять, вы можете иметь нормальный файл include и издеваемую версию. В основном файле вам просто нужно решить, какую версию include-файлов вы хотите использовать.

EDIT: Если вы хотите, чтобы направить все из командной строки, попытайтесь держать в TestFile как можно более чистым:

Файл TestCase

#!/bin/bash 

source environ 

echo "Calling three functions" 
setup 
hello 
db 

Вы хотите позвонить testcase без Params без всякой насмешки, или что-то вроде 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, и вы готовы к работе.

+0

Хорошо, проблема заключается в том, что моя «насмешка» фактически активируется флагом в командной строке и должна быть легко удалена. Подумайте об этом как о эквиваленте «сухого прогона», чем обманчиво для тестирования. –

+2

В этом случае вы можете просто использовать флаг, чтобы определить, какое определение 'connect' используется:' if [[$ dry_run == yes]]; затем connect() {echo "connect"; }; else connect() {echo "faking"; }; fi'. – chepner

+0

@chepner: Истина для простого случая. Когда у вас есть 20 тестовых и 10 интерфейсов для макета, вы хотите отделить насмешку от кода. Я бы не сделал этого с помощью командной строки, но вы можете создать целую кучу файлов для обработки ситуаций. Конечно, разные файлы include должны быть получены из специальных папок. –