python - 在 pytest 中使用全路径模拟器模拟相对路径类实例化 - 不可能吗?
问题描述
我有 2 个模块。第一个说A
:
内部模块A
我有:
from my_lib import SomeClass
def my_function:
my_var = SomeClass()
do something with my_var...
该包my_lib
是我创建的一个包,我将它在本地安装到我的站点包中(通过在我的pip install .
包的根目录中运行。我拥有__init__.py
__main__.py
正确包所需的所有文件)
另一个模块是 say test_A
。在里面test_A
,我通过以下方式使用模拟 pytest:
import A
import pytest
def test_my_function(mocker):
mocker.patch(target='my_lib.SomeClass', return_value='some_mock_value')
A.my_function()
问题是,当测试进入该模块(返回一个真实的 SomeClass 实例)时,模拟my_lib.SomeClass
不会将模拟应用于SomeClass
模块内的直接调用。它起作用的唯一方法是在模块 A 中我使用 SomeClass 调用,如下所示:A
my_function
import my_lib
.....
.....
my_var = my_lib.SomeClass()
这意味着我必须更改真实模块,以便模拟测试能够模拟调用的类,这听起来是错误的。
在没有完整路径的情况下进行修补,如下所示:
mocker.patch(target='SomeClass', return_value='some_mock_value')
将不起作用,因为 mock-pytest 将无法导入 SomeClass (因为SomeClass
站点包中不存在,仅my_lib.SomeClass
存在)。
这种情况有一个优雅的解决方案吗?
如何告诉 mock-pytestSomeClass
在模块中调用A
并且my_lib.SomeClass
从模拟路径与site-packages 中的同一个库相关?
我已经没有想法了。帮助 ?
解决方案
推荐阅读
- javascript - Javascript:play() 和 pause() html 视频不适用于鼠标悬停
- javascript - 如何对 Javascript 中的多个变量进行相同的替换
- ruby - 无法启动 sinatra 应用程序
- html - 如何让我的导航链接均匀分布并在页面中居中?
- java - ArrayList 没有正确输出
- kubernetes - 如果我不设置 master_version 和 node_version,Terraform 会尝试升级我的 gke 节点和 master 吗?
- c# - 我收到“一个项目不能有多个 AplicationXaml 项目”
- c++ - 源于 couts 的奇怪的分段错误
- html - btn 类不会在按钮之间创建空间
- python-3.x - Python3x 类型错误