我正在測試一個函數,它讀取一個文件,對內容進行操作並根據它看到的內容返回一個值。功能testme
我測試生活在module.py
。我正在運行Python 2.7。我知道我可以使用補丁修飾器和side_effect模擬文件讀取
import unittest
import module
from mock import patch, mock_open
TestTestMe(unittest.TestCase):
...
def test_test_me(self):
with patch('module.open', mock_open(read_data='1 2')) as _:
self.assertRaises(IndexError, module.testme, 'foo')
with patch('module.open', mock_open(read_data='1 2 3')) as _:
self.assertEquals(module.testme('foo'), 3)
等做到這一點
不過,我想(主要是防止重複使用with語句,並且還能夠動態地生成各種的read_data)能夠使用@patch
作爲裝飾器,使用函數定義我的read_data。像這樣的東西。我不會重複類定義和導入。
def give_contents(x):
if x == 'correct':
return mock_open(read_data='1 2 3')
else:
return mock_open(read_data='a b c')
,然後使用測試功能,如:
@patch(module.open, side_effect=give_contents)
def test_test_me(self):
self.assertEquals(module.testme('correct'), 3)
我一直運行到TypeErrors如
TypeError: test_testme() takes exactly 1 argument (2 given)
但是我設法解決這個問題。這真讓我抓狂。指導將不勝感激。如果你想要一些額外的細節,我可能已經省略了,請詢問具體細節,我會提供這些細節。
編輯:根據要求執行要測試的功能。對不起,我忽略這個「不重要」,顯然應該在那裏。
def testme(filepath):
with open(filepath, 'r') as f:
line = f.readline().strip().split()
return int(line[2])
我不確定,因爲你沒有在你給我們的代碼中包含任何test_testme函數。但是,如果它是您使用的'module.testme'方法,則忘記在方法定義中聲明字符串參數。根據你的反饋,我可能會做出這個答案。 –
這裏不要嘲笑。將「文件」對象轉換爲參數並讓其他代碼不單元測試打開文件可能會更好。然後,您可以將某種字符串IO對象作爲存根傳遞。即使你不能通過字符串IO,你仍然可以傳遞一個模擬參數來代替。 (即使我使用了一個,我可能也不會在模擬上聲明) – jpmc26
@Alceste_我添加了實現。如果你寫了一個完整的答案,那將會很棒。 – user3274289