我想單元測試解析函數,它需要一個文件路徑並返回一些文件內容。我希望能夠傳遞這些函數的數據串用於測試目的。我知道我可以通過csv.reader()或StringIO或file_handle(例如csv.reader(StringIO(「my,data」)或csv.reader(open(file))),但我可以' t看到一種方式,我可以通過一個StringIO對象來代替文件路徑,因爲open(StringIO(「my,data」))失敗。同樣,我想在這些解析方法中擁有文件打開/關閉邏輯,而不是我的代碼的主要大宗因爲這會弄亂我的主要代碼,同時也意味着我必須重新編寫所有的文件IO接口單元測試 - 用StringIO對象替換文件路徑
看來我的選擇是:
- 重寫所有EXI蜇代碼,以便它將文件句柄傳遞給解析函數 - 這真是一種痛苦!
- 使用mock.patch()來替換open()方法 - 這應該可以工作,但看起來比這個任務所要求的更復雜!
- 做一些我還沒有想到的東西,但是我堅信必須存在!
import csv
def parse_file(input):
with open(input, 'r') as f:
reader = csv.reader(f)
output = []
for row in reader:
#Do something complicated
output.append(row)
return output
import unittest
class TestImport(unittest.TestCase):
def test_read_string(self):
string_input = u"a,b\nc,d\n"
output = read_file(string_input)
self.assertEqual([['a', 'b'], ['c', 'd']], output)
def test_read_file(self):
filename = "sample_data.csv"
output = read_file(filename)
self.assertEqual([['a', 'b'],['c', 'd']], output)
爲什麼不把測試用例寫入硬盤並將路徑傳遞給他們? –
這是代碼如何工作 - 我試圖避免這種情況,因爲: ** A **我不想跟蹤很多非常小的文本文件 ** B **解析有很多配置選項 - 我很容易操縱代碼中的字符串來模擬這些,但對於這個文件需要幾十個,這使得我的構建看起來「雜亂」 – David258