为什么我的Python模拟补丁以错误的顺序出现?

Lou*_*ise 15 python mocking python-mock python-unittest

我有一个模块test.py,它使用键盘导入*从另一个模块keyboard.py导入函数.

在keyboard.py里面有两个功能:

def get_keys(keyList, timeStamped):
    return event.getKeys(keyList=keyList, timeStamped=timeStamped)

def wait_keys(keyList, timeStamped):
    return event.waitKeys(keyList=keyList, timeStamped=timeStamped)
Run Code Online (Sandbox Code Playgroud)

现在,我在test.py中的测试函数如下所示:

@mock.patch('keyboard.wait_keys')
@mock.patch('keyboard.get_keys')
def test_2(self, mock_waitKeys, mock_getKeys):

    mock_waitKeys.return_value = [['wait_keys!', 0.1]]
    mock_getKeys.return_value = [['get_keys!',0.1]]

    run_blocks(trials,noise,win,expInfo, incorrect, tone1, tone2, experiment_details,allPoints,32,60)            
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试将两个模拟返回值放在适当的位置.

然而,他们的影响似乎是倒置的!

当我在交互式控制台中调用它们而在断点处停止时(或在正常调用时检查值),两个模拟函数返回彼此的假返回值!

从控制台:

get_keys()
Out[2]: [['wait_keys!', 0.1]]
wait_keys()
Out[3]: [['get_keys!', 0.1]]
Run Code Online (Sandbox Code Playgroud)

我是否误解了传递给测试函数的模拟参数的顺序?

这可能与修补keyboard.get_keys而不是test.get_keys有关吗?

谢谢!路易丝

phy*_*Guy 20

补丁的顺序应该颠倒,因为它们是自下而上应用的.在嵌套模拟参数的python文档中查看此注释:

注意当您嵌套修补程序装饰器时,模拟将按照它们应用的相同顺序传递给修饰函数(应用装饰器的正常python顺序).这意味着从下到上,因此在上面的示例中,首先传递module.ClassName1的mock.