首页 > 解决方案 > 在 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 调用,如下所示:Amy_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 中的同一个库相关?

我已经没有想法了。帮助 ?

标签: pythonmockitopytestpython-mock

解决方案


推荐阅读