Итак, мне нужен способ «издеваться» над функцией, чтобы я мог перехватить ее вызов - это хороший способ сделать это?«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
Есть ли альтернативы для этого?
Хорошо, проблема заключается в том, что моя «насмешка» фактически активируется флагом в командной строке и должна быть легко удалена. Подумайте об этом как о эквиваленте «сухого прогона», чем обманчиво для тестирования. –
В этом случае вы можете просто использовать флаг, чтобы определить, какое определение 'connect' используется:' if [[$ dry_run == yes]]; затем connect() {echo "connect"; }; else connect() {echo "faking"; }; fi'. – chepner
@chepner: Истина для простого случая. Когда у вас есть 20 тестовых и 10 интерфейсов для макета, вы хотите отделить насмешку от кода. Я бы не сделал этого с помощью командной строки, но вы можете создать целую кучу файлов для обработки ситуаций. Конечно, разные файлы include должны быть получены из специальных папок. –