以错误顺序出现的模拟补丁?

Posted

技术标签:

【中文标题】以错误顺序出现的模拟补丁?【英文标题】:Mock Patches Appearing in the Wrong Order? 【发布时间】:2018-04-13 00:33:27 【问题描述】:

我有一个测试模块 (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)

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)            

我试图将两个模拟返回值放在适当的位置,但它们的效果是相反的。

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

get_keys()
Out[2]: [['wait_keys!', 0.1]]
wait_keys()
Out[3]: [['get_keys!', 0.1]]

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

【问题讨论】:

【参考方案1】:

补丁的顺序应该颠倒,因为它们是自下而上应用的。请参阅 python docs 中关于嵌套模拟参数的评论:

注意当你嵌套补丁装饰器时,模拟被传递到 按照他们应用的相同顺序装饰函数(普通的python 应用装饰器的顺序)。这意味着从下往上,所以 在上面的示例中,module.ClassName1 的模拟被传入 首先。

【讨论】:

以上是关于以错误顺序出现的模拟补丁?的主要内容,如果未能解决你的问题,请参考以下文章

第二种方式,修改python unittest的执行顺序,使用猴子补丁

为啥线程味精以相反的顺序出现?

更改参数顺序的 Laravel 路由中出现 404 错误

使用 Gatling 将场景模块化以按顺序运行

WAV 文件以错误的顺序保存

[模拟,字符串处理]7-7 翻转单词顺序 (20分)