带补丁的单元测试行为(烧瓶)

Jam*_*Lam 5 python unit-testing

我正在尝试patch我的烧瓶API中的方法,但似乎方法调用没有被替换.不app.test_client()这样做,我很想念在引擎盖下的东西.

例如,如果我跑

 @patch('k.stats.mstats')
  def test_ps(self, mstats):
    mstats.return_value = (1, 2, 3)
    rv = self.app.get('/ps/')
Run Code Online (Sandbox Code Playgroud)

我通过调试器运行到下面的点:

@app.route('/ps/', methods=['GET'])
def ps():
  import pdb
  pdb.set_trace()
  mstats()
Run Code Online (Sandbox Code Playgroud)

并检查mstats,我将取回未被嘲笑的功能.

但是,如果我从k.stats import mstats断点运行,我会找回我正在寻找的模拟方法.

如何确保调用模拟方法?

Mak*_*oto 6

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

patch 通过(临时)将名称指向的对象更改为另一个对象。可以有许多名称指向任何单个对象,因此要使修补工作,您必须确保修补被测系统使用的名称。

基本原则是在查找对象的位置打补丁,该位置不一定与定义的位置相同。

这就是为什么当您决定将其注入时能够观察到模拟对象的原因;您正在观察当时正在查找的修补参考。

这个例子很好地解释了那里发生的事情,但我会尽力澄清。

假设它mstats存在于 module 中stats。您正在通过from stats import mstatsmodule导入它use_stats

你会想要在 中模拟它use_stats,因为那是它的参考位置。

@patch('use_stats.mstats')
def test_stats(self, mstats):
    pass
Run Code Online (Sandbox Code Playgroud)