![](/img/trans.png)
[英]How can I reuse exception handling code for multiple functions in Python?
[英]How do I reuse same mocks for multiple functions in testing
我有一個測試文件,我在其中為每個函數重用相同的模擬。
@mock.patch.object(...)
def xyz(mock_xyz):
mock_xyz.side_effect = lambda x, y: None
....
@mock.patch.object(...)
def abc(mock_xyz):
mock_xyz.side_effect = lambda x, y: None
....
@mock.patch.object(...)
def lmn(mock_xyz):
mock_xyz.side_effect = lambda x, y: None
....
.
.
.
如何避免每次都定義模擬? PS:我在示例中只使用了一個模擬,但我在 6 個測試方法中使用了相同的四個模擬。
您可以在setUp()
定義它並使其成為您的TestCase
類的成員:
class MyTest(unittest.TestCase):
def setUp(self):
self.mock_xyz = mock.patch.object(...)
self.mock_xyz.side_effect = lambda x, y: None
def xyz(self):
with self.mock_xyz:
# Do test stuff
....
我有同樣的問題,並不喜歡每個模擬對象使用一個上下文管理器的外觀,因為 6+ 嵌套語句變得有點愚蠢。 此外,無法在 python 2.7 上運行(即使使用 unittest2),所以不確定它是否是 python 3 的專有功能。
無論如何,我想我會把我的解決方案留在這里,以防其他人像我一樣來解決這個問題。 我最終得到了這樣的結果:
import unittest2
from mock import patch
@patch('package.module.something')
@patch('package.module.SomeClass.something_else')
class TestBase(unittest2.TestCase):
def setup_mocks(self, mock_object):
mock_name = mock_object._mock_name
if mock_name == 'something':
# do something stuff
mock_object.side_effect = lambda: 'something'
elif mock_name == 'something_else':
# do something else
mock_object.side_effect = lambda: 'something else
def test_stuff(self, *mocks):
for m in mocks:
self.setup_mocks(m)
# do test stuff
現在我可以根據需要添加任意數量的模擬,並且每次測試都會對它們進行修補。 如果在不同的模塊中有兩件相同的事情可能會遇到問題,但它還沒有發生,所以當我遇到它時我會越過那座橋;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.