我正在尝试使用python的mock.patch来实现带鼻子的单元测试。
class A:
def setUp(self):
self.b = 8 #contrived example
@patch.object('module.class', 'function', lambda x: self.b)
def testOne(self):
# do test #
在这里,补丁抱怨它不知道自己(这是正确的)。什么是以干净的方式获得此类功能的最佳方法?
我知道我可以使用全局变量,或者我可以在测试中模拟它(但这涉及我在测试结束时清理对象)。
答案 0 :(得分:7)
您不能在方法装饰器上使用self
,因为您在类定义中并且该对象不存在。如果你真的想要访问self
而不只是使用一些静态值,你可以考虑采用以下方法:totest
是我的python路径中的一个模块,fn
是我要补丁的方法此外,我使用固定的return_value
而不是函数来获得更具可读性的示例
class MyTestCase(unittest.TestCase):
def setUp(self):
self.b = 8 #contrived example
def testOne(self):
with patch('totest.fn', return_value=self.b) as m:
self.assertEqual(self.b, m())
self.assertTrue(m.called)
@patch("totest.fn")
def testTwo(self,m):
m.return_value = self.b
self.assertEqual(self.b, m())
self.assertTrue(m.called)
在testOne()
中,我使用patch
作为上下文,我将拥有对self
的完全访问权限。在testTwo()
中(这是我的标准方式)我在测试开始时设置我的模拟m
,然后使用它。
最后我使用了patch()
代替patch.object()
,因为我并不真正理解为什么需要patch.object()
,但您可以随意更改它。