gpt4 book ai didi

python - 避免执行模拟类的 __init__

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:18 25 4
gpt4 key购买 nike

我有一个具有昂贵的 __init__ 函数的类。我不希望从测试中调用此函数。

为了这个例子的目的,我创建了一个在 __init__ 中引发异常的类:

class ClassWithComplexInit(object):

def __init__(self):
raise Exception("COMPLEX!")

def get_value(self):
return 'My value'

我有第二个类,它构造 ClassWithComplexInit 的实例并使用它的函数。

class SystemUnderTest(object):

def my_func(self):
foo = ClassWithComplexInit()
return foo.get_value()

我正在尝试围绕 SystemUnderTest#my_func() 编写一些单元测试。我遇到的问题是,无论我如何尝试模拟 ClassWithComplexInit__init__ 函数总是会被执行并引发异常。

class TestCaseWithoutSetUp(unittest.TestCase):

@mock.patch('mypackage.ClassWithComplexInit.get_value', return_value='test value')
def test_with_patched_function(self, mockFunction):
sut = SystemUnderTest()
result = sut.my_func() # fails, executes ClassWithComplexInit.__init__()
self.assertEqual('test value', result)

@mock.patch('mypackage.ClassWithComplexInit')
def test_with_patched_class(self, mockClass):
mockClass.get_value.return_value = 'test value'
sut = SystemUnderTest()
result = sut.my_func() # seems to not execute ClassWithComplexInit.__init__()
self.assertEqual('test value', result) # still fails
# AssertionError: 'test value' != <MagicMock name='ClassWithComplexInit().get_value()' id='4436402576'>

上面的第二种方法是我从 this similar Q&A 得到的。但它也没有用。 似乎 没有运行 __init__ 函数,但我的断言失败了,因为结果最终是一个模拟实例,而不是我的值。

我还尝试在 setUp 函数中配置一个 patch 实例,使用 startstop 函数作为the docs suggest .

class TestCaseWithSetUp(unittest.TestCase):

def setUp(self):
self.mockClass = mock.MagicMock()
self.mockClass.get_value.return_value = 'test value'
patcher = mock.patch('mypackage.ClassWithComplexInit', self.mockClass)
patcher.start()
self.addCleanup(patcher.stop)

def test_my_func(self):
sut = SystemUnderTest()
result = sut.my_func() # seems to not execute ClassWithComplexInit.__init__()
self.assertEqual('test value', result) # still fails
# AssertionError: 'test value' != <MagicMock name='mock().get_value()' id='4554658128'>

这似乎也避免了我的 __init__ 函数,但我为 get_value.return_value 设置的值没有得到遵守并且 get_value()仍然返回一个 MagicMock 实例。

我如何模拟一个具有复杂的 __init__ 的类,该类由我的被测代码实例化?理想情况下,我想要一个适用于 TestCase 类中的许多单元测试的解决方案(例如,不需要修补每个测试)。

我使用的是 Python 版本 2.7.6

最佳答案

首先,您需要使用您正在修补的相同名称来创建foo,即

class SystemUnderTest(object):

def my_func(self):
foo = mypackage.ClassWithComplexInit()
return foo.get_value()

其次,您需要配置正确的模拟对象。您正在配置未绑定(bind)方法 ClassWithComplexInit.get_value,但您需要配置 ClassWithComplexInit.return_value.get_value,这是 Mock 对象实际上是用 foo.get_value() 调用的。

@mock.patch('mypackage.ClassWithComplexInit')
def test_with_patched_class(self, mockClass):
mockClass.return_value.get_value.return_value = 'test value'
sut = SystemUnderTest()
result = sut.my_func() # seems to not execute ClassWithComplexInit.__init__()
self.assertEqual('test value', result) # still fails

关于python - 避免执行模拟类的 __init__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com