模拟Python类的方法并返回动态值
如何使用Python的模块来模拟使用同一类成员的方法模拟Python类的方法并返回动态值,python,unit-testing,Python,Unit Testing,如何使用Python的模块来模拟使用同一类成员的方法 class NameHelper(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):
class NameHelper(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.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'
显然,模拟名称不是一个合理的模拟返回值。返回值应该使用
nameheloper
的local\u id
成员我不确定为什么该问题被否决而没有任何评论。答案是,国际海事组织,不清楚
的Python文档提供了以下在安装程序中进行修补的示例:
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()
返回值
应该是类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()