gpt4 book ai didi

python - 如何修补 Python 的 datashape 中装饰器注册的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:04 26 4
gpt4 key购买 nike

我正在使用datashape Python 包并使用 @datashape.discover.register 装饰器注册新类型。我想测试一下,当我对正在注册的类型的对象调用 datashape.discover 时,它会调用正在装饰的函数。我还想按照良好的单元测试原则来做到这一点,这意味着不实际执行正在修饰的函数,因为它会在测试中产生我不希望的副作用。但是,这不起作用。

这里有一些示例代码来演示该问题:

myfile.py:

@datashape.discover.register(SomeType)
def discover_some_type(data)
...some stuff i don't want done in a unit test...

test_myfile.py:

class TestDiscoverSomeType(unittest.TestCase):
@patch('myfile.discover_some_type')
def test_discover_some_type(self, mock_discover_some_type):
file_to_discover = SomeType()

datashape.discover(file_to_discover)

mock_discover_some_type.assert_called_with(file_to_discover)

问题似乎是我想要模拟的函数在测试主体中被模拟,但是,在装饰它时(即导入它时)它没有被模拟。 discover.register 函数本质上是在内部注册被修饰的函数,以便在使用给定类型的参数调用 discover() 时查找它。不幸的是,它似乎每次都会在内部注册 real 函数,而不是我想要的修补版本,因此它总是会调用 real 函数。

关于如何能够修补正在修饰的函数并断言在调用 datashape.discover 时调用它,有什么想法吗?

最佳答案

这是我发现的一个解决方案,只是有点hacky:

sometype.py:

def discover_some_type(data):
...some stuff i don't want done in a unit test...

discovery_channel.py:

import sometype

@datashape.discover.register(SomeType)
def discover_some_type(data):
return sometype.discover_some_type(data)

test_sometype.py:

class TestDiscoverSomeType(unittest.TestCase):
@patch('sometype.discover_some_type')
def test_discover_some_type(self, mock_discover_some_type):
import discovery_channel

file_to_discover = SomeType()

datashape.discover(file_to_discover)

mock_discover_some_type.assert_called_with(file_to_discover)

关键是,在导入具有修饰函数的模块之前,您必须修补任何实际执行的操作,该修饰函数会将修补的函数注册到 datashape。不幸的是,这意味着您不能让装饰函数和在同一模块中进行发现的函数(因此逻辑上应该放在一起的东西现在分开了)。并且您的单元测试中有一些有点奇怪的函数导入(以触发 discover.register)。但至少它有效

关于python - 如何修补 Python 的 datashape 中装饰器注册的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com