Pytest-mock 未修补类模块中的导入函数

fel*_*ice 5 pytest pytest-mock

pytest-mock 修补未按预期工作。我的代码:

utils.py

def my_func():
    return 42
Run Code Online (Sandbox Code Playgroud)

classes.py

from utils import my_func

class MyClass:
    def class_method(self):
        return my_func()
Run Code Online (Sandbox Code Playgroud)

test_classes.py

import pytest
from classes import MyClass

def test_myclass(mocker):
    mocker.patch("utils.my_func", return_value=21)
    assert MyClass().class_method() == 21
Run Code Online (Sandbox Code Playgroud)

失败了,返回的是42而不是21

fel*_*ice 12

解决方案是更改测试中的补丁。代替

mocker.patch("utils.my_func", return_value=21)
Run Code Online (Sandbox Code Playgroud)

mocker.patch("classes.my_func", return_value=21)
Run Code Online (Sandbox Code Playgroud)

因为classes.py:中的这一行from .utils import my_func

  • 谢谢你的回答!这可能确实违反直觉,特别是对于那些刚开始编写单元测试的人来说 (2认同)