首页 > 解决方案 > Python Unittest模拟问题

问题描述

在 project/scripts 目录下,main.py

Class BaseClass:
  fun1(self):
    print(“fun1”)
  fun2(self):
    print(“fun2”)

def run():
  try:
    v=BaseClass()
    v.fun1()
    v.fun2()
  except:
    log.exception(“Failed”)

在项目/测试目录下 test_main.py

from main import BaseClass, run
from unittest import mock, TestCase

Class TestRun(TestCase):
  def test_run(self):
    with mock.patch(‘scripts.main.BaseClass’) as mock_base:
      mock_base.return_value = mock.Mock( **{ 
             ‘fun1.return_value’ : True, ‘fun2.return_value’: True })
      run()
      mock_base.assert_called()
      mock_base.assert_called_once(fun1)
      self.assertTrue(mock_base.called)

问题是 run() 没有拾取模拟的 BaseClass,因此断言失败。请任何人都可以建议如何解决这个问题?

标签: pythonunit-testing

解决方案


规则是您必须在使用对象的地方修补对象。在这里,您调用在模块 ( )run中找到的函数。所以你应该直接在模块中打补丁:mainfrom main import BaseClass, runBaseClassmain

from main import BaseClass, run
from unittest import mock, TestCase

class TestRun(TestCase):
  def test_run(self):
    with mock.patch('main.BaseClass') as mock_base:
      mock_base.return_value = mock.Mock( **{ 
             'fun1.return_value' : True, 'fun2.return_value': True })
      run()
      mock_base.assert_called()
      mock_base.assert_called_once()
      self.assertTrue(mock_base.called)

推荐阅读