问题标签 [pyfakefs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何替换被测模块的文件访问引用
pyfakefs
听起来非常有用:它“最初是作为核心 Python 模块的适度虚假实现开发的,以支持中等复杂的文件系统交互,并于 2006 年 9 月在 Google 范围内推出......从那时起,它收到了许多(经过充分测试) 有助于扩展其功能和实用性,并在 900 多个 Google Python 测试中使用。”
文档目前似乎仅在源代码本身的文档字符串中可用。它解释说该模块提供以下元素:
- FakeFile:提供真实文件的外观。
- FakeDirectory:提供真实目录的外观。
- FakeFilesystem:提供真实目录层次结构的外观。
- FakeOsModule:使用 FakeFilesystem 提供一个假的 os 模块替换。
- FakePathModule:伪造的 os.path 模块替换。
- FakeFileOpen:伪造的 file() 和 open() 函数替换。
然而,文档并没有解释如何在测试中有效地使用这些元素。
确保被测模块访问假文件系统而不是真实文件系统的正确方法是什么?
python - 使用 pyfakefs 运行 lxml 时访问的真实文件系统
如何使用pyfakefs运行lxml?
运行上面的示例时,我收到此错误:
我在 macOS 10.12.4 上的 Python 2.7.13 中使用 lxml 3.6.4 和 pyfakefs 3.1
python-3.x - 如何在同步测试类中使用 pyfakefs 测试 aiofile
考虑模块中的功能。
还有一个测试班
在此示例中,测试函数应设置 pyfakefs 以提供假文件。不幸的是,aiofiles 无权访问该文件,打印输出是系统上的真实文件。
有谁知道我如何修补 aiofiles 事件循环以使用 pyfakefs 作为假文件系统?在测试中,我使用名为pytest-aiofiles
(听起来像我需要的,对吗?)的库找到了以下代码片段,但它们显示的示例:
如果我将mark.asyncio
装饰器添加到test
类方法中,则导入的函数无法访问方法中生成的假文件setUp
。
我假设我遗漏了一些简单的东西,所以这一切都可以分解为一个简单的问题:我到底该如何测试这个?
谢谢!
python - 如何将 pyfakefs 与 importlib.resources.path 结合使用
给定一些已安装的软件包,以下代码可用于打印其在文件系统上的位置:
如果我想测试一个包含这样一个语句的函数pytest
作为测试套件并pyfakefs
在测试期间伪造文件系统,它会崩溃并出现一个令人困惑的错误(IsADirectoryError: [Errno 21] Is a directory
在 ubuntu 和PermissionError: [Errno 13] Permission denied
Windows 上)——甚至不需要对fs
夹具,它只需要在代码运行时就在那里。
让pytest
执行这个函数
将导致
这对我来说零意义。一个目录应该从一开始就不能用作资源吗?
我必须承认我并不真正了解该importlib.resources
模块,所以我可能只是使用错误(我的实际用例是在开发过程中创建一个文件,并避免使用__file__
找到正确的位置)。
python-3.x - importlib_resources backport 与 pyfakefs 不兼容?
我正在重构一个库以将 importlib.resources 用于 python 3.7+。我正在使用 importlib_resources backport 来实现 python 3.6 的兼容性。该代码适用于 python 3.6-3.8。但是,使用 pyfakefs 的 pytest 测试在 3.6 中失败。在测试条件下,使用 importlib_resources 返回的路径被破坏(但在“真实世界”条件下,它们正确返回)。
一个最小的例子:我有以下库结构:
在实际库中, bin 文件夹包含二进制文件(加上一个空的__init__
)。库中其他地方的代码需要一个路径。find_bin.py
演示一个将返回路径的函数:
pytest 测试test_find_bin.py
:
Python 3.7+ 按预期工作。在 python 3.6 中,expected_bin 路径被破坏:
我试图跟踪 find_bin 函数的执行,它很长而且很复杂。但是,我看到它importlib_resources
使用了 python 的 FakeFilesystem 类。我的假设是问题出在importlib_resources
pytest 和同时使用假文件系统。
我的假设正确吗?是否有解决方法让 pytest 测试使用 importlib_resources 的代码?
python - 在全新的 Python 环境中以编程方式从 Python 中执行 Python 文件
假设我有一个文件script.py
位于path = "foo/bar/script.py"
. 我正在寻找一种在 Python 中script.py
通过函数从我的主要 Python 程序中以编程方式执行的方法execute_script()
。但是,我有一些要求似乎阻止我采用涉及importlib
or的幼稚方法exec()
:
script.py
应该在“看起来很新鲜”的 Python 环境中执行,就好像它是通过$ python script.py
. 也就是说,应该相应地设置所有相关的全局变量,如、 、__name__
和__file__
工作目录,并且尽可能少的信息应该从我的主程序泄漏到文件的执行中。(不过没关系,如果可以通过模块发现它不是直接执行的。)sys.modules
sys.path
script.py
inspect
$ python script.py
我需要访问执行的结果,即
execute_script()
应该返回给定的模块script.py
及其所有变量、函数和类。(这可以防止在子进程中启动新的 Python 解释器。)execute_script()
必须在内部使用open()
才能读入script.py
。这样我就可以pyfakefs
在单元测试期间使用包来模拟文件系统。(这会阻止涉及 importlib 的简单解决方案。)execute_script()
不得(永久)修改我的主程序中的任何全局状态,例如sys.path
orsys.modules
。如果可能的话,
script.py
应该不能影响我的主程序的全局状态。(至少它不应该影响我sys.path
的sys.modules
主程序。)我需要能够修改所
sys.path
看到script.py
的。execute_function()
因此应该接受一个可选的系统路径列表作为参数。在执行期间发生的堆栈跟踪和错误处理
script.py
应该照常工作。(这使得解决方案exec()
变得困难。)该解决方案应尽可能面向未来,并且不依赖于 Python 解释器的实现细节。
我会非常感谢任何想法!
python - 模拟类方法,仍然使用一些包装代码运行原始方法
我想通过在之前和之后运行带有附加代码的原始方法来修补方法。特别是,我pyfakefs
在内存文件系统中运行测试,但有时我想使用真实的文件系统,因为某些包无法在假文件系统上运行(pybedtools
在我的情况下)。
可能有简单的方法可以做到这一点,但经过多次尝试后我无法弄清楚。这可能吗?
仅举个例子,下面我正在尝试修补to_csv
熊猫。
python - 保持 pathlib.(Posix)Path 在子类化时由 pyfakefs 修补
我以PosixPath
这种方式进行了子类化:
并添加了几种@property
方法。
现在,如果我想测试它(我使用pytest
),它不起作用:
运行测试输出(在第 行n.stat()
):
并非完全出乎意料,因为我猜,只有PosixPath
. 修补了pyfakefs
,而不是我自己的类,即使它继承自PosixPath
.
但我希望能够在保留pyfakefs
. 继承的方法、字段等PosixPath
仍然按pyfakefs
原样修补PosixPath
,只有我添加的属性没有修补。有没有办法做到这一点?
python - 在 python 单元测试中模拟磁盘空间不足
我正在尝试编写一个单元测试来测试磁盘已满时函数的行为。在大多数测试运行时,我需要文件访问功能正常运行,以便实际创建我正在创建的文件,然后在某一时刻我需要磁盘“满”。我找不到使用 来执行此操作的方法mock_open()
,因为由此创建的文件对象似乎在函数调用之间不存在。我尝试使用pyfakefs
并设置磁盘大小,self.fs.set_disk_usage(MAX_FS_SIZE)
但是当我尝试在测试中运行它时,它允许used_size
变为负数,这意味着总是有可用空间(尽管奇怪的是,他们的示例代码可以正常工作)。
有没有办法在我的代码中的特定点模拟磁盘空间不足错误?模拟 write 函数以产生副作用是我的直接想法,但我无法访问我在测试代码中写入的文件对象,因为它深埋在函数调用中。
编辑:看起来我在 pyfakefs 中发现了一个错误
Edit2:pyfakefs 中的错误已修复;现在按预期工作。仍然有兴趣知道是否有办法让 f.write() 用简单的模拟抛出 OSError。
python - 在 pytest 中使用附加文件维护两个 pyfakefs 文件系统
我正在尝试使用pytest
配置系统编写单元测试,该配置系统应该在几个不同的位置查找配置文件。我可以pyfakefs
通过fs
插件使用来创建一个夹具,该夹具提供一组文件,包括一个位置的配置文件,但我希望进行单元测试以检查两个位置并且首选正确的位置。
我最初的想法是我可以创建第一个夹具,然后添加一个文件:
这背后的想法是任何测试 usingfake_files
都不会找到配置,但 usinguser_config
会。但是,使用该user_config
夹具的单元测试找不到该文件。这可能吗?
实际上在第一个夹具中添加了很多东西,因此将两个系统维护为两个完全独立的夹具会重复代码,我不清楚底层 fs 对象是否甚至可以并行使用。