Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python 2的unittest模块中模拟原始输入_Python_Unit Testing_Input - Fatal编程技术网

在python 2的unittest模块中模拟原始输入

在python 2的unittest模块中模拟原始输入,python,unit-testing,input,Python,Unit Testing,Input,我试图理解如何使用python的unittest框架 我有一段代码,看起来像这样-- 有人能帮我开发unittest模块来测试这个吗。我问这个问题是为了学习如何使用单元测试(我试图学习TTD:测试驱动开发) 到目前为止,我已经想到了这个 ... 导入单元测试 导入操作系统路径 类TestFunctions(unittest.TestCase): def设置(自): self.prompt='输入文件名:' def test_get_文件(自身): #TODO确保新文件名的文件名参数请求为空 fi

我试图理解如何使用python的unittest框架

我有一段代码,看起来像这样--

有人能帮我开发unittest模块来测试这个吗。我问这个问题是为了学习如何使用单元测试(我试图学习TTD:测试驱动开发)

到目前为止,我已经想到了这个 ... 导入单元测试 导入操作系统路径

类TestFunctions(unittest.TestCase):

def设置(自):
self.prompt='输入文件名:'
def test_get_文件(自身):
#TODO确保新文件名的文件名参数请求为空
filename=find\u author.get\u valid\u文件名(self.prompt)
self.assertTrue()
#TODO确保有效文件名返回“文件名”
#TODO确保无效文件名提示文件不退出并请求新文件名
如果name==“main”:
unittest.main()

一种简单的方法是使用monkey patch
raw\u input

例如,在您的测试模块中(因为您应该将受测试者和测试者拆分为单独的文件),您可能有:

import module_being_tested
... run tests ...
在运行测试之前,您只需执行以下操作:

import module_being_tested

def mock_raw_input(s):
    return 'data.txt'

module_being_tested.raw_input = mock_raw_input

... run tests ....
现在,当您的testee模块调用
raw\u input
时,它实际上将调用
mock\u raw\u input
,并且将始终返回
'data.txt'

扩展到这个问题,我需要模拟不同的连续输入,因此始终返回相同的字符串是不够的。我就是这样解决的:

import module_being_tested

mock_raw_input_counter = 0
mock_raw_input_values = []
def mock_raw_input(s):
    global mock_raw_input_counter
    global mock_raw_input_values
    mock_raw_input_counter += 1
    return mock_raw_input_values[mock_raw_input_counter - 1]

module_being_tested.raw_input = mock_raw_input
然后在测试中,您希望使用此多输入功能:

def test_interactive_sequence_selection_dummy_2_99_0_Z_1(self):
    global mock_raw_input_counter
    global mock_raw_input_values
    mock_raw_input_counter = 0
    mock_raw_input_values = ["2", "99", "0", "Z", "1", ""]
    new_sequences = module_being_tested.interactive_sequence_selection(["A", "B", "C"], [None])
    self.assertEqual(new_sequences, ["C", "A", "B"])
这将模拟输入以下值:

2[ENTER]
99[ENTER]
0[ENTER]
Z[ENTER]
1[ENTER]
[ENTER] (no input, just pressing Enter)

(交互式序列选择中的代码使用
while s!=“”:
循环要求用户输入各种值,并以空的
回车键终止)

谢谢!。)!。。现在我明白了!
def test_interactive_sequence_selection_dummy_2_99_0_Z_1(self):
    global mock_raw_input_counter
    global mock_raw_input_values
    mock_raw_input_counter = 0
    mock_raw_input_values = ["2", "99", "0", "Z", "1", ""]
    new_sequences = module_being_tested.interactive_sequence_selection(["A", "B", "C"], [None])
    self.assertEqual(new_sequences, ["C", "A", "B"])
2[ENTER]
99[ENTER]
0[ENTER]
Z[ENTER]
1[ENTER]
[ENTER] (no input, just pressing Enter)