问题标签 [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.

0 投票
1 回答
2574 浏览

python - 如何替换被测模块的文件访问引用

pyfakefs听起来非常有用:它“最初是作为核心 Python 模块的适度虚假实现开发的,以支持中等复杂的文件系统交互,并于 2006 年 9 月在 Google 范围内推出......从那时起,它收到了许多(经过充分测试) 有助于扩展其功能和实用性,并在 900 多个 Google Python 测试中使用。”

文档目前似乎仅在源代码本身的文档字符串中可用。它解释说该模块提供以下元素:

  • FakeFile:提供真实文件的外观。
  • FakeDirectory:提供真实目录的外观。
  • FakeFilesystem:提供真实目录层次结构的外观。
  • FakeOsModule:使用 FakeFilesystem 提供一个假的 os 模块替换。
  • FakePathModule:伪造的 os.path 模块替换。
  • FakeFileOpen:伪造的 file() 和 open() 函数替换。

然而,文档并没有解释如何在测试中有效地使用这些元素。

确保被测模块访问假文件系统而不是真实文件系统的正确方法是什么?

0 投票
1 回答
190 浏览

python - 使用 pyfakefs 运行 lxml 时访问的真实文件系统

如何使用pyfakefs运行lxml

运行上面的示例时,我收到此错误:


我在 macOS 10.12.4 上的 Python 2.7.13 中使用 lxml 3.6.4 和 pyfakefs 3.1

0 投票
1 回答
396 浏览

python-3.x - 如何在同步测试类中使用 pyfakefs 测试 aiofile

考虑模块中的功能。

还有一个测试班

在此示例中,测试函数应设置 pyfakefs 以提供假文件。不幸的是,aiofiles 无权访问该文件,打印输出是系统上的真实文件。

有谁知道我如何修补 aiofiles 事件循环以使用 pyfakefs 作为假文件系统?在测试中,我使用名为pytest-aiofiles(听起来像我需要的,对吗?)的库找到了以下代码片段,但它们显示的示例:

如果我将mark.asyncio装饰器添加到test类方法中,则导入的函数无法访问方法中生成的假文件setUp

我假设我遗漏了一些简单的东西,所以这一切都可以分解为一个简单的问题:我到底该如何测试这个?

谢谢!

0 投票
1 回答
856 浏览

python - 如何将 pyfakefs 与 importlib.resources.path 结合使用

给定一些已安装的软件包,以下代码可用于打印其在文件系统上的位置:

如果我想测试一个包含这样一个语句的函数pytest作为测试套件并pyfakefs在测试期间伪造文件系统,它会崩溃并出现一个令人困惑的错误(IsADirectoryError: [Errno 21] Is a directory在 ubuntu 和PermissionError: [Errno 13] Permission deniedWindows 上)——甚至不需要对fs夹具,它只需要在代码运行时就在那里。

pytest执行这个函数

将导致

这对我来说零意义。一个目录应该从一开始就不能用作资源吗?

我必须承认我并不真正了解该importlib.resources模块,所以我可能只是使用错误(我的实际用例是在开发过程中创建一个文件,并避免使用__file__找到正确的位置)。

0 投票
1 回答
157 浏览

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_resourcespytest 和同时使用假文件系统。

我的假设正确吗?是否有解决方法让 pytest 测试使用 importlib_resources 的代码?

0 投票
1 回答
267 浏览

python - 在全新的 Python 环境中以编程方式从 Python 中执行 Python 文件

假设我有一个文件script.py位于path = "foo/bar/script.py". 我正在寻找一种在 Python 中script.py通过函数从我的主要 Python 程序中以编程方式执行的方法execute_script()。但是,我有一些要求似乎阻止我采用涉及importlibor的幼稚方法exec()

  • script.py应该在“看起来很新鲜”的 Python 环境中执行,就好像它是通过$ python script.py. 也就是说,应该相应地设置所有相关的全局变量,如、 、__name____file__工作目录,并且尽可能少的信息应该从我的主程序泄漏到文件的执行中。(不过没关系,如果可以通过模块发现它不是直接执行的。)sys.modulessys.pathscript.pyinspect$ python script.py

  • 我需要访问执行的结果,即execute_script()应该返回给定的模块script.py及其所有变量、函数和类。(这可以防止在子进程中启动新的 Python 解释器。)

  • execute_script()必须在内部使用open()才能读入script.py。这样我就可以pyfakefs在单元测试期间使用包来模拟文件系统。(这会阻止涉及 importlib 的简单解决方案。)

  • execute_script()不得(永久)修改我的主程序中的任何全局状态,例如sys.pathor sys.modules

  • 如果可能的话,script.py应该不能影响我的主程序的全局状态。(至少它不应该影响我sys.pathsys.modules主程序。)

  • 我需要能够修改所sys.path看到script.py的。execute_function()因此应该接受一个可选的系统路径列表作为参数。

  • 在执行期间发生的堆栈跟踪和错误处理script.py应该照常工作。(这使得解决方案exec()变得困难。)

  • 该解决方案应尽可能面向未来,并且不依赖于 Python 解释器的实现细节。

我会非常感谢任何想法!

0 投票
2 回答
81 浏览

python - 模拟类方法,仍然使用一些包装代码运行原始方法

我想通过在之前和之后运行带有附加代码的原始方法来修补方法。特别是,我pyfakefs在内存文件系统中运行测试,但有时我想使用真实的文件系统,因为某些包无法在假文件系统上运行(pybedtools在我的情况下)。

可能有简单的方法可以做到这一点,但经过多次尝试后我无法弄清楚。这可能吗?

仅举个例子,下面我正在尝试修补to_csv熊猫。

0 投票
1 回答
45 浏览

python - 保持 pathlib.(Posix)Path 在子类化时由 pyfakefs 修补

我以PosixPath这种方式进行了子类化:

并添加了几种@property方法。

现在,如果我想测试它(我使用pytest),它不起作用:

运行测试输出(在第 行n.stat()):

并非完全出乎意料,因为我猜,只有PosixPath. 修补了pyfakefs,而不是我自己的类,即使它继承自PosixPath.

但我希望能够在保留pyfakefs. 继承的方法、字段等PosixPath仍然按pyfakefs原样修补PosixPath,只有我添加的属性没有修补。有没有办法做到这一点?

0 投票
0 回答
65 浏览

python - 在 python 单元测试中模拟磁盘空间不足

我正在尝试编写一个单元测试来测试磁盘已满时函数的行为。在大多数测试运行时,我需要文件访问功能正常运行,以便实际创建我正在创建的文件,然后在某一时刻我需要磁盘“满”。我找不到使用 来执行此操作的方法mock_open(),因为由此创建的文件对象似乎在函数调用之间不存在。我尝试使用pyfakefs并设置磁盘大小,self.fs.set_disk_usage(MAX_FS_SIZE)但是当我尝试在测试中运行它时,它允许used_size变为负数,这意味着总是有可用空间(尽管奇怪的是,他们的示例代码可以正常工作)。

有没有办法在我的代码中的特定点模拟磁盘空间不足错误?模拟 write 函数以产生副作用是我的直接想法,但我无法访问我在测试代码中写入的文件对象,因为它深埋在函数调用中。

编辑:看起来我在 pyfakefs 中发现了一个错误

Edit2:pyfakefs 中的错误已修复;现在按预期工作。仍然有兴趣知道是否有办法让 f.write() 用简单的模拟抛出 OSError。

0 投票
0 回答
19 浏览

python - 在 pytest 中使用附加文件维护两个 pyfakefs 文件系统

我正在尝试使用pytest配置系统编写单元测试,该配置系统应该在几个不同的位置查找配置文件。我可以pyfakefs通过fs插件使用来创建一个夹具,该夹具提供一组文件,包括一个位置的配置文件,但我希望进行单元测试以检查两个位置并且首选正确的位置。

我最初的想法是我可以创建第一个夹具,然后添加一个文件:

这背后的想法是任何测试 usingfake_files都不会找到配置,但 usinguser_config会。但是,使用该user_config夹具的单元测试找不到该文件。这可能吗?

实际上在第一个夹具中添加了很多东西,因此将两个系统维护为两个完全独立的夹具会重复代码,我不清楚底层 fs 对象是否甚至可以并行使用。