Авторы модульных тестов скажут вам, что модульные тесты должны быть автономными, то есть они не должны иметь доступа к сети или файловой системе (особенно не в режиме записи). Тесты сети и файловой системы выходят за рамки модульных тестов (хотя вы можете подвергнуть их интеграционным тестам).
Говоря в общем, для такого случая я бы выделил коды urllib и коды для записи в файл для отдельных функций (которые не будут проверяться модулем), а также вставил макет-функции во время модульного тестирования.
т.е. (слегка сокращенно для лучшего чтения):
def get_web_content(url):
# Extracted code
url_handler = urllib2.urlopen(url)
content = url_handler.read()
url_handler.close()
return content
def write_to_file(content, filename, tmpdir):
# Extracted code
file_handler = open(os.path.join(tempdir, filename), "w")
file_handler.write(content)
file_handler.close()
def download_distribution(url, tempdir):
# Original code, after extractions
distribution_contents = get_web_content(url)
filename = get_file_name(url)
write_to_file(distribution_contents, filename, tmpdir)
return True
И, в тестовом файле:
import module_I_want_to_test
def mock_web_content(url):
return """Some fake content, useful for testing"""
def mock_write_to_file(content, filename, tmpdir):
# In this case, do nothing, as we don't do filesystem meddling while unit testing
pass
module_I_want_to_test.get_web_content = mock_web_content
module_I_want_to_test.write_to_file = mock_write_to_file
class SomeTests(unittest.Testcase):
# And so on...
И затем я предлагаю второе предложение Даниэля, вам следует прочитать более подробный материал по модульному тестированию.