我试图测试一个python类。我想模仿一些类的方法,但不是全部。使用mock.patch
可以很好地实现这一点。我的问题是:
这有什么清洁的解决方案吗?
为了提供更多颜色,这里有一个例子:
# test_me.py
class ClassUnderTest:
# All foo functions should be mocked
def foo1(self):
pass
def foo2(self):
pass
def foo3(self):
pass
# All bar functions should NOT be mocked
def bar1(self):
pass
def bar2(self):
pass
def bar3(self):
pass
# test.py
@mock.patch.object(test_me.ClassUnderTest, 'foo3', autospec=True)
@mock.patch.object(test_me.ClassUnderTest, 'foo2', autospec=True)
@mock.patch.object(test_me.ClassUnderTest, 'foo1', autospec=True)
class MyTestCase(unittest.TestCase):
def setup_mocks(self, mock_foo1, mock_foo2, mock_foo3):
# Do things like assign side_effect or return_value to each of the foo mocks
pass
def test_1(self, mock_foo1, mock_foo2, mock_foo3):
self.setup_mocks(mock_foo1, mock_foo2, mock_foo3)
# Do test_1 tests
def test_2(self, mock_foo1, mock_foo2, mock_foo3):
self.setup_mocks(mock_foo1, mock_foo2, mock_foo3)
# Do test_2 tests
这个解决方案变得越来越不干净我需要模拟的类和函数越多。有更好的解决方案吗?
我准备接受答案'您需要重构代码以使其更易于测试。我曾经习惯于从C / C ++世界设计架构测试。但是,我希望从动态语言中获得更好的效果。我已经使用python很长一段时间,但从来没有深入研究过嘲笑。
答案 0 :(得分:0)
可能有助于你的一件事就是在设置方法中删除了课程。
class ClassUnderTestStub(ClassUnderTest):
def __init__(self, *args, **kwargs):
self.arbitrary_attr = None
...
def setUp(self):
self.helper = self.ClassUnderTestStub()
self.helper.arbitrary_function = mock.MagicMock(...)
def testFoo(self):
self.helper.foo_dependency = mock.MagicMock(...)