내가 전문가는 아니지만하지만 한번 풀어주지 . 먼저 약간의 리팩토링 (refactoring) : 기능적으로 (모든 클래스를 제거하고) 불필요한 것들을 제거합니다. 이렇게하면 훨씬 쉽게 테스트 할 수 있습니다. 정말로 클래스에 원한다면 클래스가 항상이 함수를 호출하도록 만들 수 있습니다.
def pass_file_name(base_filename, exists):
"""return a list of filenames that exist
based upon `base_filename`.
use `os.path.isfile` for `exists`"""
log_files = []
if exists(base_filename):
log_files.append(base_filename)
for i in range(1, 8):
filename = base_filename + "." + str(i)
if exists(filename):
log_files.append(filename)
return log_files
def read_log_files (self, log_files):
"""read and parse each line from log_files
use `pass_file_name` for `log_files`"""
log_entrys = []
for filename in log_files:
with open(filename) as myfile:
for line in myfile:
log_entrys.append(line.split())
return log_entrys
이제 우리는 쉽게 exists
에 사용자 정의 함수에 전달하여 pass_file_name
을 테스트 할 수 있습니다. 우리가 os.path.isfile
작품을 가정으로
class Test_pass_file_name(unittest.TestCase):
def test_1(self):
"""assume every file exists
make sure all logs file are there"""
exists = lambda _: True
log_files = pass_file_name("a", exists)
self.assertEqual(log_files,
["a", "a.1", "a.2", "a.3",
"a.4", "a.5", "a.6", "a.7"])
def test_2(self):
"""assume no files exists
make sure nothing returned"""
exists = lambda _: False
log_files = pass_file_name("a", exists)
self.assertEqual(log_files, [])
# ...more tests here ...
우리는 첫 번째 함수의 꽤 좋은 테스트를 가지고 있어야합니다. 테스트를 실제로 수행 할 수 있지만 실제로 파일을 만들려면 pass_file_name
을 exists = os.path.isfile
으로 호출하십시오.
두 번째 테스트는 더 어렵습니다. 최고의 (유닛) 테스트가 네트워크, 데이터베이스, GUI 또는 하드 드라이브를 만지지 않는다는 말을 들었습니다. 어쩌면 좀 더 리팩토링하면 더 쉽게 만들 수 있습니다. 열려있는 조롱은 일할 수 있었다; 또는 실제로 테스트 기능의 일부 긴 파일을 작성하고 그들을 읽을 수있다. 완전히 새로운 죄송
How do I mock an open used in a with statement (using the Mock framework in Python)?
"... 그래서 파일 이름이나 파일과 같은 객체를 사용할 수 있습니다."어떻게해야합니까? str (파일 이름)의 인스턴스를 확인하십시오. 그렇지 않으면 IO 객체라고 가정합니다. – Symmitchry