2014-10-17 2 views
3

파일 입력, 열기 및 처리를 수행하고 일부 데이터를 출력하는 데 사용하는 코드가 있습니다. 나는 기능을 작동 시켰고 지금은 단위 테스트를하고있다. 아래는 코드 예제이다.Python에서 디렉토리 구조 조롱

def foo(dir): 
    path_to_search = join(dir, "/baz/foo") 

    if isdir(path_to_search): 
    #path exists so do stuff... 

     for fname in listdir(path_to_search): 
      do_stuff() 

    else: 
     print "path doesn't exist" 

내가 과거가 충분히 쉽게 존재하지 않는 테스트를 만들 수 있었다,하지만 난 디렉토리 구조의 "/ 바즈/foo는"부분이 존재한다는 주장의 위 당신이 볼 수 있듯이했습니다 (에 프로덕션은 디렉토리 구조가이 파일을 가져야 만하는 경우도 있고 처리하지 않아도됩니다.

TempDir을 사용하여 임시 디렉토리 구조를 만들고 결합하려고 시도했지만 코드는 항상 그 길은 존재하지 않는다는 말을 시작합니다.

os.listdir의 출력을 조롱하여 필요한/baz/foo 규칙을 따르는 임시 디렉토리 구조를 만들 필요가 없습니까?

+0

와 ['mocker.replace()'] (HTTP가 : //labix.org/mocker#CA-a25a2c16ecea818439349b5f0b23eda994ab34bf_010). –

+0

@LukasGraf : stdlib'unittest.mock' 또는 백 포트 인'mock'을 사용하는 것이 더 좋습니다. –

+0

@MartijnPieters 나는 개인적으로 Labix Mocker를 선호한다. [패치 할 곳] (http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch)을 참조하십시오. Labix mocker는 실제로 패치를 적용한 객체에 대한 참조를 수집하고 패치 및 리셋 한 객체를 참조하여 작업을 처리합니다. –

답변

4

가짜 디렉토리 구조를 만들 필요가 없습니다. isdir()listdir() 기능을 모의하기 만하면됩니다. 사용

unittest.mock library (또는 파이썬 버전 < 3.3 똑같은 일이 외부 mock library) :

try: 
    # Python >= 3.3 
    from unittest import mock 
except ImportError: 
    # Python < 3.3 
    import mock 

with mock.patch('yourmodule.isdir') as mocked_isdir, \ 
     mock.patch('yourmodule.listdir') as mocked_listdir: 
    mocked_isdir.return_value = True 
    mocked_listdir.return_value = ['filename1', 'filename2'] 

    yourmodule.foo('/spam/eggs') 

    mocked_isdir.assert_called_with('/spam/eggs/baz/foo') 
    mocked_listdir.assert_called_with('/spam/eggs/baz/foo') 
당신은 Labix 거만한를 사용할 수
+0

흠, 조금 더 설명해 주시겠습니까? 스팸/알을 입력 할 때 작동하지 않는 것 같습니다. 나는 isdir이 true가되어야한다고 말하고 있고, dir은이 파일 이름을 반환해야한다. 이제는이 파일 이름이 "진짜"인가 아니면 임시로 만들어서 읽을 수있게해야 하는가? – openingceremony

+0

@openingceremony : 그렇지 않으면 실제 경로가 필요한 기능이 사용자 모의 (mock)로 대체되었으므로 코드에 해당 코드가 실제 필요하지 않습니다. 실제 경로가 필요하지 않으므로 테스트중인 코드가 기대하는 바를 반환하도록 구성하면됩니다. –

+0

이 코드를 실행했을 때 어설 션이 호출되지 않았으므로 실패했습니다. 내 코드가 isdir/listdir을 호출하면 안됩니까? – openingceremony