我正在使用 python unittest 模塊來測驗一個帶有命令列引數的檔案。引數是一個檔案名,然后傳遞給一個函式,如下所示:
file_name = str(sys.argv[1])
file = open(file_name)
result = main_loop(file)
print(result)
我的測驗設定如下:
class testMainFile(unittest.TestCase):
def test_main_loop(self):
file = open('file_name.json')
result = main_file.main_loop(file)
self.assertEqual(result, 'Expected Result')
if __name__ == 'main':
unittest.main()
當我運行測驗時,我得到一個“IndexError:list index out of range”。
我嘗試在運行測驗時傳遞引數,但無濟于事。如何運行我的測驗沒有錯誤?
uj5u.com熱心網友回復:
我認為你在這里有幾個選擇。首先去檔案和結帳補丁,因為我認為你可以逃脫
from unittest.mock import patch
@patch('sys.argv', ['mock.py', 'test-value'])
def test_main_loop(self):
娛樂選項:
一個是簡單地覆寫sys.argv你的電話旁邊的
def test_main_loop(self):
file = open('file_name.json')
orginal_argv = sys.argv
sys.argv = ['mock argv', 'my-test-value']
result = main_file.main_loop(file)
sys.argv = orginal_argv
self.assertEqual(result, 'Expected Result')
其次是為您的函式創建一個簡單的包裝器
def set_sys_argv(func: Callable):
sys.argv = ['mock.py', 'my_test_value']
def wrapper(*args, **kwargs):
func()
return wrapper
并將其與測驗功能一起使用
@set_sys_argv
def test_main_loop(self):
我們可以稍微改進它并使其更通用,制作一個接受要模擬的值的裝飾器
def set_sys_argv(*argv):
sys.argv = argv
def _decorator(func: Callable):
def wrapper(*args, **kwargs):
func()
return wrapper
return _decorator
并類似地使用它來修補
@set_sys_argv('mock.py', 'test-value')
def test_main_loop(self):
第三是創建一個背景關系管理器,同樣:
class ReplaceSysArgv(list):
def __enter__(self):
self._argv = sys.argv
sys.argv = ['mock', 'my-test-value']
return self
def __exit__(self, *args):
sys.argv = self._argv
并將其與您的代碼一起使用
def test_main_loop(self):
file = open('file_name.json')
with ReplaceSysArgv():
result = main_file.main_loop(file)
self.assertEqual(result, 'Expected Result')
uj5u.com熱心網友回復:
您必須在檢索它們之前將引數推送到 sys.argv (如果您的代碼是從命令列引數中提取的 - 我不清楚您在測驗中的哪個位置使用命令列引數,但我離題了)
所以像第一次做的事情
import sys
sys.argv = ['mock_filename.py', 'json_file.json']
#... continue with rest of program / test.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/414954.html
標籤:
