福吉:@补丁不工作时从X导入Y'ing而不是import X?

2024-05-18 17:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在fudge1.0.3中遇到了一个奇怪的patch装饰器。通过导入类时,它不会修补模块

from <module> import <class>

但进口时效果很好

^{pr2}$

具有相应的代码自适应。在

下面是一个最小化的设置:

mdle.py

class Klaas(object):

    def __init__(self):
        # easyest way to signal this class has been instantiated accidently
        raise Exception(">:[")

一些.py(测试无效):

from mdle import Klaas()
def instantiate():
    instance = Klaas()

一些.py(测试工作):

import mdle
def instantiate():
    instance = mdle.Klaas()

一些_测试.py

import unittest
import fudge

import some

class SomeTest(unittest.TestCase):

    @fudge.patch("mdle.Klaas")
    def test_somethingb(self, Klaas_mock):
        klaas_inst = (Klaas_mock.expects_call()
                            .returns_fake())


        # Receiving the exception
        some.instantiate()

我应该换一种方式修补吗?这是软糖的限制,还是一个错误?在


Tags: instancefrompyimportselfdefsomeunittest
1条回答
网友
1楼 · 发布于 2024-05-18 17:42:11

你必须在对象被引用的地方补上名字,而不是定义对象的地方。在

记住,模块只是带有指向其他对象的名称的dict的对象(类也是对象)。同一个对象在不同的模块中可以有多个(可能相同)名称。修补使名称临时指向Fake,而不是原始对象。在

我假设在您的第一个(不工作)some.py模块中,您的意思是:

from mdle import Klass

它创建一个在该模块中使用的名称some.Klass。默认情况下,名称恰好与mdle中的名称匹配,但实际上有两个名称指向同一个类对象。如果你想使用一个伪的,你需要修补some中的名称,因为这是用来引用被测模块中的类的名称。在

您的测试补丁mdle.Klass,它不是some中使用的名称,因此您的代码仍然使用它自己未修补的名称来获取真正的类对象。在这种情况下,您需要修补some.Klass。在

在第二个(工作)some.py中,导入整个mdle模块并使用该模块中的名称引用该类。这就是修补mdle.Klass起作用的原因。在这种情况下,您正在修补正在使用的名称。在

相关问题 更多 >

    热门问题