2014-07-11 15 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到一個孤立的文件系統中運行的單元測試。在運行每個測試用例之後,將文件系統恢復到乾淨狀態。這是一種大錘的方法,但對於測試非常複雜的庫,可能更容易使這種方法奏效。

相關問題