2014-07-11 4 views
0

단위 테스트를 위해 py.test를 사용합니다. 난 그냥 이런 일이 :파일 시스템에 액세스하지 않고 'mkdir'기능을 테스트하는 방법은 무엇입니까?

Class Site(object): 

    def set_path(self): 
     """Checks if the blog folder exists. Creates new folder if necessary."""   
     if not os.path.isdir(self.user_dir): 
      print "Creating new directory:", self.user_dir 
      os.mkdir(self.user_dir) 
     else: 
      print "\n**", self.user, "directory already exists." 

어떻게 할 수있는 파일 시스템을 건드리지 않고 내가 단위 테스트이?

이러한 문제를 처리 할 때는 일반적인 경험 법칙이 있습니까?

나는 오랫동안 그것에 대해 생각해 왔으며 해결책을 생각할 수 없다.

내 응용 프로그램에 많은 파일 시스템 액세스가 포함될 수 있으며 단위 테스트시 이러한 메서드를 통합하는 방법을 알지 못합니다.

폴더가 올바른 경로에 만들어 졌는지 구체적으로 테스트하고 싶습니다. 경로는 self.user_dir입니다.

나는 이미지를 self.user_dir으로 다운로드하는 다운로드 기능을 가지고 있습니다. 이미지가 다운로드되었는지 테스트하고 싶습니다. 이것을 테스트하는 방법은 무엇입니까?

+0

어떤 운영체제입니까? – Matt

+0

모든 것을 모의 할 수 있습니다. http://mock.readthedocs.org/en/latest/ – dm03514

+0

@Matt Windows 및 Debian – BBedit

답변

3

이 조롱 당신이 사용할 수있는 방법 (권장) 또는 분리가 있습니다

비웃음 : 테스트시

이는 "모의"버전으로 os.mkdir 대체 :

class MockMkdir(object): 
    def __init__(self): 
     self.received_args = None 
    def __call__(*args): 
     self.received_args = args 

class MyTest(unittest.TestCase): 
    def setUp(): 
     self._orig_mkdir = os.mkdir 
     os.mkdir = MockMkdir() 
    def tearDown(): 
     os.mkdir = self._orig_mkdir 
    def test_set_path(self): 
     site = Site() 
     site.set_path('foo/bar') 
     self.assertEqual(os.mkdir.received_args[0], 'foo/bar') 

Mock은 이러한 종류의 작업을 더 우아하고 적은 코드 행으로 수행하는 데 도움이되는 라이브러리입니다.

절연

사용 chroot는 고립 된 파일 시스템 내에서 unittests를 실행합니다. 각 테스트 케이스를 실행 한 후에 파일 시스템을 깨끗한 상태로 되돌립니다. 이는 좀 더 복잡한 접근 방법이지만 매우 복잡한 라이브러리를 테스트하는 경우이 접근 방식을 사용하는 것이 더 쉬울 수도 있습니다.

관련 문제