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

时间:2015-04-23 21:30:37

标签: python unit-testing

我正在尝试使用我的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>,我会找回我正在寻找的模拟方法。

如何确保调用模拟方法?

1 个答案:

答案 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