当前位置: 首页 > 面试题库 >

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

燕野
2023-03-14
问题内容

有没有一种干净的方法来修补对象,以使您的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,但是我希望有一种更好的方法可以在所有函数,类方法,静态方法,未绑定方法等上以相同的方式工作。


问题答案:

与您类似的解决方案,但使用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)


 类似资料:
  • 我开始使用静态代码分析工具,比如Checkstyle、PMD和FindBugs。PMD允许通过在行尾添加注释将代码标记为已审核: 我真的不喜欢尾随注释,CheckStyle也不喜欢(“不要使用尾随注释”)。有没有一种方法可以告诉PMD,在不使用后续注释的情况下对特定代码进行了审阅?

  • 假设我有两个类叫做ad。 它们都实现了。 对于只有两种方法,分别称为和。 一切都很好。但是,虽然这似乎很好地利用了s,但我认为如果我需要向这个添加方法,实现就会中断,即我需要去实现这些类中的新方法,这打破了“封闭-开放原则”。 所以我想,除了,如果将来需要添加新方法,我还会使用类。 例如,。 这听起来是个好计划(如果不是,请纠正我)。 但问题是,如果这些类已经有其他类了怎么办?在这种情况下,我不能

  • 问题内容: 我正在尝试使用富有想象力的Mock测试库测试Django应用程序时模拟某些东西。我似乎无法完全正常工作,我正在尝试这样做: 我究竟做错了什么? 问题答案: 啊,我对在哪里应用该补丁装饰感到困惑。固定:

  • 偶尔可能会需要在 FreeBSD 源代码树上包含某些妨碍性的文件。 例如, 如果某个设备需要首先加载一小段二进制代码才能正常工作, 而我们并没有这些代码的源文件, 则这个二进制文件就被认为是妨碍性的。 在 FreeBSD 源码树上引入这类妨碍性文件时的规则如下。 由系统 CPU 解释或执行的任何以非源代码格式保存的文件, 都被认为是妨碍性的。 授权限制多于 BSD 或 GNU 的任何文件都是妨碍性

  • 相比之下,Java确实允许虚拟泛型方法。这里也清楚了如何实现:Java泛型在运行时被删除,因此泛型方法是运行时的常用方法,因此不需要修改。 但是现在到了C#。C#确实有具体化的泛型。对于具体化泛型,特别是当使用值类型作为类型参数时,泛型方法必须有不同的版本。但是我们遇到了与C++相同的问题:每当对泛型方法进行新的实例化时,我们都需要修改vtable。 我对C#的内部工作没有太深的了解,所以我的直觉

  • 我试图模拟一个方法,从另一个方法调用,而不使用类对象。在指定的代码中,我想模拟methodA(),它调用methodB(),而不使用对象。 我无法更改现有类中的任何内容。 我已经尝试过: 莫基托。doReturn(“id”)。当(反对)。方法b(员工)