Все три ситуации, которые вы описали, - это то, где вам нужно сделать все возможное, чтобы убедиться, что вы используете слабую связь в своем дизайне.
Вам действительно нужно провести модульное тестирование метода Python raw_input
? open
метод? os.environ.get
? Нет.
Вам необходимо настроить дизайн так, чтобы вы могли заменить другие способы получения этого ввода. Затем во время ваших юнит-тестов вы добавите заглушку какого-то рода, которая на самом деле не вызывает raw_input
или open
.
Например, ваш обычный код может выглядеть примерно так:
import os
def say_hello(input_func):
name = input_func()
return "Hello " + name
def prompt_for_name():
return raw_input("What is your name? ")
print say_hello(prompt_for_name)
# Normally would pass in methods, but lambdas can be used for brevity
print say_hello(lambda: open("a.txt").readline())
print say_hello(lambda: os.environ.get("USER"))
Сессия выглядит так:
What is your name? somebody
Hello somebody
Hello [some text]
Hello mark
Тогда ваш тест будет выглядеть так:
def test_say_hello():
output = say_hello(lambda: "test")
assert(output == "Hello test")
Имейте в виду, что вам не нужно тестировать средства ввода-вывода языка (если только вы не разрабатываете язык, что совершенно иная ситуация).