我在函数签名中使用pathlib.Path.cwd()作为默认参数。
def foobar(dir_arg=pathlib.Path.cwd() / 'logs'):
# ...当我用pyfakefs对这个函数进行单元测试时,参数没有得到修补。但是patch_default_args设置为True。
这是MWE。
#!/usr/bin/env python3
import pyfakefs.fake_filesystem_unittest as pyfakefs_ut
import pathlib
class Logging(pyfakefs_ut.TestCase):
def setUp(self):
print('PyFakeFS activated')
self.setUpPyfakefs(
allow_root_user=False,
patch_default_args=True)
def test_foobar(self):
foobar()
def foobar(dir_arg=pathlib.Path.cwd() / 'logs'):
dir_local = pathlib.Path.cwd() / 'logs'
print(f'dir_arg: {dir_arg}')
print(f'dir_local: {dir_local}')
if __name__ == '__main__':
print('Without PyFakeFS')
foobar()将其作为测试运行(使用激活的pyfakefs):
python3 -m unittest x.py
PyFakeFS activated
dir_arg: /home/user/tab-cloud/_transfer/logs
dir_local: /logs
.
----------------------------------------------------------------------
Ran 1 test in 0.744s
OK在不使用pyfakefs的情况下运行此常规程序
./x.py
Without PyFakeFS
dir_arg: /home/user/tab-cloud/_transfer/logs
dir_local: /home/user/tab-cloud/_transfer/logs作为测试运行时的预期输出将是
PyFakeFS activated
dir_arg: /logs
dir_local: /logs还有一个关于这个问题的公开发行。但是现在我认为这不是一个bug,而是显示器面前的一个问题。
发布于 2022-08-13 19:14:26
我的答案是基于PyFakeFS的维护者的反馈。
这个问题符合patch_default_args参数不考虑的边缘情况。它修补文件系统功能,但不修复类(如我的例子)。
解决方案之一是使用modules_to_reload参数。
为了用代码演示解决方案,我将MWE从问题中分离成两个文件。
这是x.py
#!/usr/bin/env python3
import pathlib
def foobar(dir_arg=pathlib.Path.cwd() / 'logs'):
dir_local = pathlib.Path.cwd() / 'logs'
print(f'dir_arg: {dir_arg}')
print(f'dir_local: {dir_local}')
if __name__ == '__main__':
print('Without PyFakeFS')
foobar()我是test_x.py
#!/usr/bin/env python3
import pyfakefs.fake_filesystem_unittest as pyfakefs_ut
import pathlib
import x
class Logging(pyfakefs_ut.TestCase):
def setUp(self):
print('PyFakeFS activated')
self.setUpPyfakefs(
allow_root_user=False,
modules_to_reload=[x])
def test_foobar(self):
x.foobar()重装顺序
在使用modules_to_reload时,加载顺序在某些边缘情况下也很重要。一个示例和一个解决方案可以找到这里。
关于这里的MWE。当foobar()位于导入到x/__init__.py中的子模块(sub_x.py)中时,应该首先加载子模块。
modules_to_reload=[x.sub_x, x]https://stackoverflow.com/questions/73342581
复制相似问题