導入的方法內進口我得到了以下功能測試:如何嘲笑一個功能,即從不同的模塊
my_package.db_engine.db_functions.py:
from ..utils import execute_cmd
from my_package.db_engine.db_functions import dbinfo
def dbinfo(db_name):
params = (cmd_cfg.DB, add_pj_suffix(db_name))
cmd = get_db_cmd_string(cmd_cfg.DBINFO, params=params)
cmd_result = execute_cmd(cmd)
result_dict = map_cmd_output_to_dict(cmd_result)
return result_dict
此功能獲取數據庫的名稱,然後從中建立一個命令字符串並使用execute_cmd
方法執行該命令爲subprocess
。 我想測試這個功能,而不需要實際執行subprocess
。我只想檢查命令是否已正確構建並正確傳遞至execute_cmd
。因此我需要模擬從模塊utils
導入的execute_cmd
方法。
我的文件夾結構如下:
my_project
|_src
| |_my_package
| | |_db_engine
| | | |_db_functions.py
| | | |_ __init__.py
| | |_utils.py
| | |_ __init__.py
| | |_ ....
| |_ __init__.py
|_tests
|_test_db_engine.py
所以對於我的測試,我試過在test_db_engine.py
如下:
import unittest
from mock import patch
from my_pacakge.db_engine.db_functions import dbinfo
def execute_db_info_cmd_mock():
return {
'Last Checkpoint': '1.7',
'Last Checkpoint Date': 'May 20, 2015 10:07:41 AM'
}
class DBEngineTestSuite(unittest.TestCase):
""" Tests für DB Engine"""
@patch('my_package.utils.execute_cmd')
def test_dbinfo(self, test_patch):
test_patch.return_value = execute_db_info_cmd_mock()
db_info = dbinfo('MyDBNameHere')
self.assertEqual(sandbox_info['Last Checkpoint'], '1.7')
實際產量命令爲1.6
的Last Checkpoint
的執行。因此,爲了驗證是否使用了模擬返回值,我將其設置爲1.7
。 但是沒有使用該函數的模擬,因爲測試用例的執行仍然產生1.6
,因爲它正在執行本應該用模擬進行修補的實際函數。
任何想法我在這裏錯了什麼?
謝謝,這個工作正常=) – Igle