繁体   English   中英

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

[英]Unit Test Behavior with Patch (Flask)

我正在尝试patch我的烧瓶api中的方法,但似乎方法调用没有被替换。 app.test_client()是否在我缺少的引擎盖下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 ,我会找回我正在寻找的k.stats import mstats方法。

如何确保调用模拟方法?

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

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

基本原则是修改查找对象的位置,该位置不一定与定义对象的位置相同。

这就是为什么当你决定将它注入时,你能够观察到被模拟的对象; 你正在观察那个时刻被抬起的修补参考。

这个例子可以很好地解释那里发生了什么,但我会试着澄清一下。

让我们说mstats存在于模块stats from stats import mstats模块use_stats from stats import mstats导入它。

你将要在use_stats模拟它,因为那是它的参考地点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM