2016-02-06 24 views
0

我有一個函數,如果文件的大小太大(> 1MB)會引發異常。我想在不使用真實圖像的情況下測試此功能。我知道可以用mock_open來模擬文件對象,但是我怎麼給這個假文件一個大小呢?如何模擬一個設置大小的文件對象?

這裏是我想測試功能:

def _check_image_size(img_path): 
    megabyte = 1048576 

    if os.path.getsize(img_path) > megabyte: 
     raise ValueError("Image must be less than or equal to 1MB in size.") 

所以只是重申以不同的方式的問題是:如何在我測試此功能,無需在尺寸上比使用1MB一個真正的文件更大?

P.S.我是否應該爲這個功能寫一個測試?我是一個沒有多少經驗的新開發人員。我是否想通過測試來過度?

+0

近似重複,但至少適用:http://stackoverflow.com/questions/19672138/how-do-i-mock-the-filesystem-in-python-unit-tests。這涵蓋了我的答案中的大部分內容(以及我認爲增加的內容)。 – chepner

回答

1

嘲笑函數本身更簡單。

with mock.patch('os.path.getsize', return_value=2*1024*1024) 
    try: 
     _check_image_size("any arbitrary string") 
    except ValueError: 
     print "Successfully raised ValueError" 
    else: 
     print "Did not raise ValueError" 

或者,不使用mock庫(或類似的東西),猴子直接修補功能。

import os.path 

os.path.getsize = lambda path: return 2*1024*1024 
try: 
    _check_image_size("any arbitrary string") 
except ValueError: 
    print "Successfully raised ValueError" 
else: 
    print "Did not raise ValueError" 
+0

謝謝。我知道我必須嘲笑一些東西,但是我嘲笑了一些錯誤的東西。嘲笑os.path.getsize完美地工作。 –

0

如果要測試這一點,你應該嘲笑os.path.getsize代替 - 與unittest.mock嘲笑文件對象提供了一個read方法,也許writeclose和其他文件對象的特定功能 - 不過這個功能使得系統stat調用到實際文件在文件系統上:模擬文件對象不能在文件系統上「看到」。

因此,要做的事情是相信os.path.getsize作品,並將其返回值模擬爲「True」和「False」來編寫您想要的測試。

0

模擬是你的朋友

import unittest 
from unittest.mock import patch 
import os 

def _check_image_size(img_path): 
    megabyte = 1048576 

    if os.path.getsize(img_path) > megabyte: 
     raise ValueError("Image must be less than or equal to 1MB in size.") 

class Test(unittest.TestCase): 

    @patch("os.path.getsize") 
    def test_getsize(self, getsize): 
     getsize.return_value = 1024 ** 2 + 4 

     self.assertRaises(ValueError,lambda: _check_image_size("some path to a big* file")) 

我認爲它的OK來測試像這樣的一個功能。

相關問題