在python 2的unittest模块中模拟raw_input()

caf*_*00d 4 python unit-testing input

我正在尝试了解如何使用 python 的单元测试框架

我有一段看起来像这样的代码——

while True:
    filename = raw_input('Enter file')
    if os.path.exists(filename):
        break
    else:
        print "That file does not exist"
return filename
Run Code Online (Sandbox Code Playgroud)

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

到目前为止,我已经想出了这个...... import unittest import os.path

类 TestFunctions(unittest.TestCase):

def setUp(self):
    self.prompt = 'Enter filename: '

def test_get_file(self):

    # TODO make sure empty filename argument requests for new filename
    filename = find_author.get_valid_filename(self.prompt)
    self.assertTrue(<EXPRESSION?>)

    # TODO make sure valid filename returns the "filename"
    # TODO make sure invalid filename prompts that file does not exit and requests new filename 
Run Code Online (Sandbox Code Playgroud)

if name == " main ": unittest.main()

vge*_*gel 5

一种简单的方法是使用monkey-patch raw_input

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

import module_being_tested
... run tests ...
Run Code Online (Sandbox Code Playgroud)

在运行测试之前,您只需执行以下操作:

import module_being_tested

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

module_being_tested.raw_input = mock_raw_input

... run tests ....
Run Code Online (Sandbox Code Playgroud)

现在,当您的测试对象模块调用 时raw_input,它实际上会调用mock_raw_input,并且总是会'data.txt'返回。