gpt4 book ai didi

python - 如何修补方法 '' .join 使用模拟库

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

要创建给定函数的单元测试,我需要修补 ''.join(...)

我已经尝试了很多方法来做到这一点(使用 mock 库)但我就是无法让它工作,即使我有一些使用该库创建单元测试的经验。

出现的第一个问题是 str 是一个内置类,因此它不能被模拟。 post by William John Bert展示了如何处理这个(datetime.date 在他的例子中)。 "Partial mocking" section 中也有可能的解决方案图书馆的官方文件。

第二个问题是 str 并没有真正直接使用。相反,调用文字 '' 的方法 join。那么,补丁的路径应该是什么?

这些选项都不起作用:

  • patch('__builtin__.str', 'join')
  • patch('string.join')
  • patch('__builtin__.str', FakeStr)(其中 FakeStrstr 的子类)

任何帮助将不胜感激。

最佳答案

你不能,因为无法在内置类上设置属性:

>>> str.join = lambda x: None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'str'

并且您不能修补 str,因为 ''.join 使用文字,因此解释器将总是创建一个 str,无论您如何尝试替换 __builtin__ 中的 str

如果您阅读生成的字节码,您可以看到这一点:

>>> import dis
>>> def test():
... ''.join([1,2,3])
...
>>> dis.dis(test)
2 0 LOAD_CONST 1 ('')
3 LOAD_ATTR 0 (join)
6 LOAD_CONST 2 (1)
9 LOAD_CONST 3 (2)
12 LOAD_CONST 4 (3)
15 BUILD_LIST 3
18 CALL_FUNCTION 1
21 POP_TOP
22 LOAD_CONST 0 (None)
25 RETURN_VALUE

字节码在编译时生成,如您所见,第一个LOAD_CONST加载'',这是一个str,无论您如何在运行时更改 str 的值。

可以 做的是使用可以模拟的包装函数,或者避免使用文字。例如,使用 str() 而不是 '' 允许您使用实现的子类来模拟 strjoin 方法(尽管这可能会影响太多代码并且可能不可行,具体取决于您使用的模块)。

关于python - 如何修补方法 '' .join 使用模拟库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146778/

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