我正在尝试使用我的flask api中的app.test_client()
方法,但看起来方法调用没有被替换。 @patch('k.stats.mstats')
def test_ps(self, mstats):
mstats.return_value = (1, 2, 3)
rv = self.app.get('/ps/')
是否会做一些我缺少的事情。
例如,如果我运行
@app.route('/ps/', methods=['GET'])
def ps():
import pdb
pdb.set_trace()
mstats()
我将调试器运行到以下几点:
mstats
并检查k.stats import mstats
,我将取回未被嘲笑的功能。
但是,如果我从断点运行<!DOCTYPE html>
,我会找回我正在寻找的模拟方法。
如何确保调用模拟方法?
答案 0 :(得分:3)
这是一个令人困惑的概念,但the documentation of patch
会尽力解释它。
补丁通过(暂时)更改名称指向的对象与另一个对象。可以有许多名称指向任何单个对象,因此要修补工作,您必须确保修补被测系统使用的名称。
基本原则是你可以在查找对象的位置进行修补,这不一定与定义对象的位置相同。
这就是为什么当你决定将它注入时,你能够观察到被模拟的对象;你正在观察那个时刻被查看的补丁参考。
这个例子可以很好地解释那里发生了什么,但我会试着澄清一下。
假设mstats
生活在模块stats
中。您是通过模块from stats import mstats
中的use_stats
导入的。
你想要在use_stats
中嘲笑它,因为那是它的参考地点。
@patch('use_stats.mstats')
def test_stats(self, mstats):
pass