未调用 Pytest 模拟补丁函数
Pytest mock patch function not called
我确定调用了一个函数(因为它上面有一个 print 语句)。
我的测试目标是函数handle_action
。
__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
,我会收到同样的错误。
问题是你打补丁来不及了,在创建 handlers
dict 时名称已经在导入时解析,即当代码被 imported:
handlers = {
HANDLE_NOTHING: handle_nothing, # <-- name lookup of "handle_nothing" happens now!
}
在测试中调用 handle_action
时,名称 handle_nothing
名称是否已用其他名称修补并不重要,因为该名称实际上并未被 handle_action
完全没有。
相反,您需要直接修补 handlers
字典中的值。
我确定调用了一个函数(因为它上面有一个 print 语句)。
我的测试目标是函数handle_action
。
__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
,我会收到同样的错误。
问题是你打补丁来不及了,在创建 handlers
dict 时名称已经在导入时解析,即当代码被 imported:
handlers = {
HANDLE_NOTHING: handle_nothing, # <-- name lookup of "handle_nothing" happens now!
}
在测试中调用 handle_action
时,名称 handle_nothing
名称是否已用其他名称修补并不重要,因为该名称实际上并未被 handle_action
完全没有。
相反,您需要直接修补 handlers
字典中的值。