未调用 Pytest 模拟补丁函数

时间:2021-04-07 20:02:30

标签: python pytest python-mock

我确定调用了一个函数(因为上面有一个打印语句)。

我的测试目标是名为 SecurityForms 的文件上的函数 handle_action

附注。我的猜测是模块的名称 (__init__.py) 是问题的根源。

__init__.py

还有我的测试

from .dummy import HANDLE_NOTHING, handle_nothing

handlers = {
    HANDLE_NOTHING: handle_nothing,
}


def handle_action(action, user, room, content, data):
    func = handlers.get(action)

    if func:
        func(user, room, content, data)

跑步时我得到:

import mock

from handlers import HANDLE_NOTHING, handle_action


def test_handle_dummy_action():
    action = HANDLE_NOTHING
    user = "uid"
    room = "room"
    content = "test"
    data = {}

    with mock.patch("handlers.dummy.handle_nothing") as f:
        handle_action(action, user, room, content, data)

        f.assert_called_with()

如果我从 E AssertionError: expected call not found. E Expected: handle_nothing() E Actual: not called. 更改为 handlers.dummy.handle_nothing,我会遇到同样的错误。

我不知道,其他模拟工作正常。

也许是文件名? (代码在 handlers.handle_nothing 中)

1 个答案:

答案 0 :(得分:2)

问题是你打补丁来得太晚了,名字在创建 handlers dict 的时候已经在导入时解析了,即代码被导入时:

handlers = {
    HANDLE_NOTHING: handle_nothing,  # <-- name lookup of "handle_nothing" happens now!
}

到在您的测试中调用 handle_action 时,名称 handle_nothing 名称是否已用其他内容修补并不重要,因为该名称实际上并未被 {{1} 使用

相反,您需要直接修补 handle_action dict 中的值。