当前位置: 首页 > 知识库问答 >
问题:

Python 2 unittest模块中的模拟raw_input()

席俊驰
2023-03-14

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

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

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

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

到目前为止,我想出了这个...导入单元测试导入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 

如果name==“main”:unittest。main()

共有2个答案

颛孙喜
2023-03-14

扩展vgel对这个问题的回答,我需要模拟不同的连续输入,所以总是返回相同的字符串是不够的。我是这样解决的:

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)

interactive_sequence_selection中的代码使用而s!= "":循环,要求用户输入各种值,并以空Enter按结束)

曾飞沉
2023-03-14

一种简单的方法是使用monkey patchraw\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 ....

现在,当您的测试对象模块调用raw\u input时,它实际上将调用mock\u raw\u input,并且将始终获取数据。txt'返回。

 类似资料:
  • 问题内容: 我正在编写pytest插件,该插件应测试旨在在一组特定环境中运行的软件。 我正在编写的软件在一个更大的框架内运行,这使某些Python模块仅在框架内运行我的Python软件时可用。 为了测试我的软件,我需要“模拟”或伪造整个模块(实际上是很多模块)。我需要以某种类似的方式实现其功能,但是我的问题是,如何使用py.test插件将该虚假的Python模块提供给我的软件代码? 例如,假设我的

  • 问题内容: 我想嘲笑。但是,当我运行以下代码时,该模拟被完全忽略了,我不确定为什么 测试代码: 模块代码: 问题答案: 您没有在正确的位置打补丁。您在定义的地方打补丁: 您需要修补导入的位置,即在编写此行的“模块代码”中: 即,它应该看起来像: 要获得快速指南,请阅读文档中的部分:修补位置。

  • 我很困惑于嘲笑如何对实现进行单元测试。问题是我想嘲笑不同的预期行为。 有没有办法做到这一点?由于导入只能在文件的顶部,并且为了能够模拟某些内容,必须在导入之前声明它。我也试图传递一个本地函数,这样我就可以覆盖行为,但jest抱怨你不允许传递任何本地的东西。 在内部,可以想象使用

  • 问题内容: 我想了解如何从导入的模块执行功能。 这是我到目前为止的位置。 app / mocking.py: app / my_module / init.py: 测试/模拟测试.py: 这不 符合 我的预期。“已修补”模块仅返回的未模拟值。如何模拟要导入到被测名称空间中的其他包中的方法? 问题答案: 当您从包中使用装饰器时,您 未在 修补名称空间(从本例中导入模块),而是在被测试的名称空间中对其

  • 问题内容: 我在Python中使用时遇到了一些困难: 测试实际上返回正确的值,但它是Mock对象,不是。您如何在Python库中模拟属性? 问题答案: 您需要使用和: 这意味着:调用时,在该调用的返回值上,为属性设置a以返回value 。

  • null 如上所示,它导出了一些命名函数,而且重要的是 使用了 。 开玩笑地说,当我为 编写单元测试时,我希望模拟 函数,因为我不希望 中的错误影响我为 编写的单元测试。我的问题是我不确定最好的方法是: 如有任何帮助/洞察力,我们将不胜感激。