python模拟-在不妨碍实现的情况下修补方法

发布于 2021-01-29 18:43:28

有没有一种干净的方法来修补对象,以使您的assert_call*助手获得测试用例的帮助,而无需实际删除操作?

例如,如何修改该@patch行以通过以下测试:

from unittest import TestCase
from mock import patch


class Potato(object):
    def foo(self, n):
        return self.bar(n)

    def bar(self, n):
        return n + 2


class PotatoTest(TestCase):

    @patch.object(Potato, 'foo')
    def test_something(self, mock):
        spud = Potato()
        forty_two = spud.foo(n=40)
        mock.assert_called_once_with(n=40)
        self.assertEqual(forty_two, 42)

我可能会使用一起破解side_effect,但是我希望有一种更好的方法可以在所有函数,类方法,静态方法,未绑定方法等上以相同的方式工作。

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    与您类似的解决方案,但使用wraps

    def test_something(self):
        spud = Potato()
        with patch.object(Potato, 'foo', wraps=spud.foo) as mock:
            forty_two = spud.foo(n=40)
            mock.assert_called_once_with(n=40)
        self.assertEqual(forty_two, 42)
    

    根据文档

    wraps
    :要包装的模拟对象的项目。如果wraps不为None,则调用Mock会将调用传递给包装的对象(返回实际结果)。对模拟的属性访问将返回一个Mock对象,该对象包装了包装对象的相应属性(因此,尝试访问不存在的属性将引发AttributeError)。


        class Potato(object):
    
            def spam(self, n):
                return self.foo(n=n)
    
            def foo(self, n):
                return self.bar(n)
    
            def bar(self, n):
                return n + 2
    
    
        class PotatoTest(TestCase):
    
            def test_something(self):
                spud = Potato()
                with patch.object(Potato, 'foo', wraps=spud.foo) as mock:
                    forty_two = spud.spam(n=40)
                    mock.assert_called_once_with(n=40)
                self.assertEqual(forty_two, 42)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看