【问题标题】:using self in python @patch decorator在 python @patch 装饰器中使用 self
【发布时间】:2014-11-17 18:22:25
【问题描述】:

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

在这里,patch 抱怨它不认识自己(这是正确的)。以干净的方式获得这种功能的最佳方法是什么?

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

【问题讨论】:

    标签: python unit-testing mocking patch


    【解决方案1】:

    你不能在方法装饰器上使用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(),但你可以随意更改它。

    【讨论】:

    • testTwo 看起来不错。使用 patch.object 而不是 patch 没有具体原因。我想这是最好的解决方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 2016-09-05
    • 2021-12-23
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多