在python @patch装饰器中使用self

时间:2014-11-17 18:22:25

标签: python unit-testing mocking patch

我正在尝试使用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 #

在这里,补丁抱怨它不知道自己(这是正确的)。什么是以干净的方式获得此类功能的最佳方法?

我知道我可以使用全局变量,或者我可以在测试中模拟它(但这涉及我在测试结束时清理对象)。

1 个答案:

答案 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(),但您可以随意更改它。