我正在尝试在我的Flask API中使用patch方法,但似乎该方法调用并未被替换。 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运行,我会得到想要的模拟方法。

如何确保模拟方法被调用?

最佳答案

这是一个非常令人困惑的概念,但是the documentation of patch 尽力解释它。

这就是为什么当您决定将其注入(inject)时能够观察到该模拟对象的原因。您正在观察当时正在查找的修补引用。
该示例可以很好地解释那里发生的事情,但我会尽力弄清楚。
假设mstats位于stats模块中。您正在通过from stats import mstats模块中的use_stats导入它。
您将要在use_stats中对其进行模拟,因为这是其引用的地方。

@patch('use_stats.mstats')
def test_stats(self, mstats):
    pass

09-26 03:37