问题标签 [pytest-mock]

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 回答
935 浏览

python - 来自不同模块的pytest模拟类

我正在尝试模拟一个在我要测试的类的构造函数中实例化的类。如果我在与我尝试测试的模块相同的模块中定义我试图模拟的类,那么一切正常,但是当它们位于单独的模块中时,我会出错。

这是我的示例,取自此处(请注意,在我的真实示例中,测试类位于“tests”子模块中,其他两个文件位于“app.src.code ...”模块中。

我错过了什么?

助手.py:

工人.py:

test_worker.py:

0 投票
1 回答
226 浏览

python - 单元测试 Python mixin,它引用了在别处定义的函数

我有以下情况:

单元测试:

defined_elsewhere() 方法是在派生自该 mixin 的类中定义的。但是,出于开发目的,在将它与类集成之前,我们首先处理 mix_foo.Foo。但是,当我尝试对 doFoo 方法进行单元测试时,pytest 显示以下错误:Attributeerror <....> 没有属性“defined_elsewhere”。我的补丁是否正确,是否有其他方法可以对该方法进行单元测试?基本上我想模拟 self.defined_elsewhere 的调用/返回值,以便可以测试 doFoo 方法。

0 投票
1 回答
323 浏览

python - 如何使用 python glob 对简单函数进行 DRYer 测试?

我有一个功能可以在当前位置搜索文件,然后在下载文件夹中搜索,如果找不到,则会引发错误。使用 pytest 和 pytest-mock,我能够使用比测试代码大得多的代码来测试代码。有没有办法让这个更紧/更干?

测试代码:

这里有三个测试场景。在当前找到,在下载中找到,但未找到。测试代码:

0 投票
1 回答
162 浏览

python - 如何模拟未按名称调用的函数?

假设我有一个装饰器,它收集它装饰的所有函数,以便在将来的某个时候调用。

我的装饰器.py

然后,我在一个模块中有一个函数,其中一个将由我的装饰器保存。

我的模块.py

现在,如果我导入mymodule并调用CallLater.call_now(),log_a并将log_b被调用。但是假设在测试期间,我想log_blog_c. 我会尝试用模拟进行替换。

模拟测试.py

但是当我跑步时pytest,我发现我的模拟不起作用。

我想这'mymodule.log_b'是错误的模拟目标,因为它没有被调用为mymodule.log_b(),但我不确定在这种情况下使用什么来代替。任何建议表示赞赏!

0 投票
1 回答
125 浏览

python - pytest 中的 tmpdir 是否仅在我们写入文件时才创建文件?

当我fp = tmpdir.join("hello.txt")在 pytest 中使用时,pytest 实际上是在我的临时目录中创建一个文件还是仅在我编写时才创建fp.write("hello")

0 投票
1 回答
1078 浏览

python - pytest-mock pathlib.Path.open

我需要模拟pathlib.Path.open使用pytest-mock.

真正的open_func打开一个yaml-file。返回值是一个常规的dict。我怎样才能模拟Path.open只加载另一个yaml-file被调用的test-config.yaml

我的代码无法正常工作,因为conf它将简单地变成str(“test_config.yaml”)。它应该是一个dict.

编辑:为了更接近我的现实世界问题,我提供了以下代码。我有一个类TryToMock,它基本上需要两个文件作为输入。该方法load_files只是加载这些文件(实际上是 .yaml 文件)并返回输出。这些 .yaml 文件实际上是一些配置文件。

在我的单元测试中,我会TryToMock通过 pytest 的parametrize. 因此,我想通过fixture. 然后我可以monkeypatch在运行之前在我的各种测试中输入一些条目load_files

为了不再加载原始文件,我需要Path.openTryToMock. 我想改为传递monkeypatchedyaml 文件(即以 a 的形式dict)。困难在于我必须区分这两个文件。那就是我不能简单地模拟Path.open具有相同文件内容的函数。

0 投票
1 回答
5262 浏览

python - pytest mocker fixture mock 模块从定义的地方而不是使用的地方

我有一些实用程序功能src/utils/helper.py

想象一下,我有一个func_a在 utils/helper.py 中调用的函数,它在我的项目中的多个地方使用。

每次我使用它时,我都会像这样导入它

现在我想func_a在我的测试中模拟这个。

我想在 conftest.py 中创建一个夹具,这样我就不需要为每个测试文件一次又一次地编写模拟函数。

问题是,在我的模拟函数中,我不能这样写。

https://pypi.org/project/pytest-mock/

我必须为每个测试文件这样写

根据文档https://docs.python.org/3/library/unittest.mock.html#where-to-patch

由于我正在导入,因此func_afrom src.utils.helper import func_a必须模拟使用它的位置而不是定义它的位置。

但是这种方法的问题是我无法在 conftest.py 的夹具中定义它

目录结构

0 投票
0 回答
357 浏览

pytest - Python asynctest 模拟补丁装饰器溢出到后续测试中

我正在尝试测试异步功能。为此,我正在使用pytest-asyncioand asynctest。我需要检查在我正在测试的函数中使用的函数被调用了多少次。为此,我正在使用aynsctest.mock.patch(). 我的测试文件如下所示:

如果我单独运行测试用例,它们就会通过。但是,当我运行整个模块时,要运行的第二个测试用例会失败 - 无论它们运行的​​顺序如何。我怀疑这是因为第一个测试用例的模拟仍然影响要运行的第二个测试用例。

我在这里做错了什么?

0 投票
1 回答
1446 浏览

python - pytest-mock 如何修补嵌套函数

我有以下代码:

我的模块.py

我在 test_my_module.py 中使用 pytest 和 pytest-mock 和 mocker 作为夹具

test_my_module.py

但是当我在 py.test 中运行时出现错误:

有没有什么方法可以修改 mocker.patch 函数\方法,它们在测试模块中不可见,并且嵌套在该函数中,我想测试?

0 投票
0 回答
38 浏览

python - Python中的间谍链函数

我正在尝试对一个在内部调用其他两个函数的函数进行单元测试。如下所示

another_fn_a并且another_fn_b是此类扩展的基类的一部分,并返回同一类本身。

现在,我正在尝试测试 myfunctionA以查看它是否使用正确的参数调用其他两个函数。我可以监视another_fn_a,但监视another_fn_b似乎不起作用。我的测试如下所示

第一个断言似乎正在工作,但是,对于第二个断言,我得到断言错误,说 another_fn_b 没有被调用。

我在这里做错了什么?