[英]Mock the method of a Python class and return a dynamic value
如何使用 Python 的unittest.mock模塊來模擬使用同一類成員的方法?
class NameHelper(object):
def __init__(self):
self.local_id = 0
def next_id(self):
self.local_id += 1
return str(self.local_id)
注意,我在setUp
方法中使用patch.start 和 patch.stop進行修補:
class TestSomeClient(unittest.TestCase):
def setUp(self):
patcher = patch('helpers.name_helper.NameHelper')
self.addCleanup(patcher.stop)
self.mock_name_helper = patcher.start()
# The actual mocked values
self.mock_name_helper.return_value.local_id = 0
self.mock_name_helper.return_value.next_id.return_value = 'mock-name'
顯然, mock-name不是一個合理的模擬返回值。 返回值應使用local_id
成員NameHelper
。
我不確定為什么這個問題在沒有評論的情況下被否決了。 答案是,IMO,不清楚。
patch.start 和 patch.stop的 Python 文檔提供了以下用於在 setUp 中打補丁的示例:
class MyTest(TestCase):
def setUp(self):
self.patcher1 = patch('package.module.Class1')
self.MockClass1 = self.patcher1.start()
def tearDown(self):
self.patcher1.stop()
MyTest('test_something').run()
但是,在修補整個類時,這是一種誤導。 以下內容更有幫助:
class MockClass1():
pass
class MyTest(TestCase):
def setUp(self):
self.patcher1 = patch('package.module.Class1')
self.MockClass1 = self.patcher1.start()
self.MockClass1.return_value = MockClass1()
def tearDown(self):
self.patcher1.stop()
請注意,附加行:
self.MockClass1.return_value = MockClass1()
return_value
應該是類MockClass1
的新實例。 應用於我的例子:
class MockNameHelper(object):
def __init__(self):
self.local_id = 0
def next_id(self):
self.local_id += 1
return str(self.local_id)
class TestSomeClient(unittest.TestCase):
def setUp(self):
patcher = patch('helpers.name_helper.NameHelper')
self.addCleanup(patcher.stop)
self.MockNameHelper = patcher.start()
self.MockNameHelper.return_value = MockNameHelper()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.