无法在Python中正确模拟依赖模块中的方法

问题描述 投票:0回答:1

这是我的项目结构

|-- project
    |-- util.py
    |-- main.py
    |-- tests
        |-- test_main.py

main.py
文件中,我引用了
util.py

中的函数
from util import rename

def use_rename():
    after_rename = rename("name")
    return after_rename

这就是我在

rename
 中实现 
util.py

函数的方法
def rename(name: str) -> str:
    return name

最后我在

test_main.py
文件中测试它

import sys
import os
from unittest.mock import patch

sys.path.append(os.path.join(os.path.dirname(__file__), ".."))

from main import use_rename

@patch("util.rename")
def test_use_rename(mock_rename):
    mock_rename.return_value = "name2"
    assert use_rename() == "name"

如您所见,我尝试模拟

rename
函数的返回结果并假设测试应该失败,但它总是成功。我的代码有问题吗?

python testing mocking
1个回答
0
投票

您的代码中只有一个错误:您在定义函数的模块

rename
中模拟了函数
util
,但您必须通过指令模拟在
util
模块中导入的对象
main.py

from util import rename

所以你只需要改变

test_main.py

import sys
import os
from unittest.mock import patch

sys.path.append(os.path.join(os.path.dirname(__file__), ".."))

from main import use_rename

#@patch("util.rename")    # <--- comment this decorator
@patch("main.rename")     # <--- add this decorator
def test_use_rename(mock_rename):
    mock_rename.return_value = "name2"
    assert use_rename() == "name"

经过此更改,执行的输出为:

...
    assert use_rename() == "name"
AssertionError
© www.soinside.com 2019 - 2024. All rights reserved.