我在Python中进行单元测试相当新,但是做了一些,所以我理解它的基础知识。我遇到的一个问题是能够模拟输入,然后根据该模拟输入测试STDOUT。我在这篇文章中尝试了解决方案:python mocking raw input in unittests
但是用给定的方法没有找到任何成功。我的测试似乎在要求输入时被挂断了。我希望能够模拟Run
模块的输入,然后能够测试STDOUT,它可以是True/False
这是我的Run
代码
#imports
import random
def main():
#variables
dolphins = random.randrange(1,11)
guess = int(input("This is a prompt"))
print(guess == dolphins)
这里真的很简单。这是我的Testsuite
import unittest
from unittest.mock import patch
from Run import *
class GetInputTest(unittest.TestCase):
@patch('builtins.input', return_value=1)
def test_answer_false(self, input):
self.assertEqual(main(), 'False')
if __name__ == "__main__":
unittest.main()
所以在这里我输入的值为1
,然后在我的断言期间调用main()
并期望值False
但它甚至没有得到到目前为止,该程序只是持续运行,我认为因为它等待input
,我可能没有正确地嘲笑它。我还尝试将builtins.input
提供给@patch
参数,我得到了相同的结果。
没有错误消息或追溯。希望有更多经验的人可以告诉我我做错了什么。谢谢大家提前帮助我。
答案 0 :(得分:0)
您可以将main作为一个带参数的函数。
def main(args):
...do stuff
if __name__ == '__main__':
args = input('Get input')
main(args)
然后将它作为正常功能进行单元测试。
class TestMain(unittest.TestCase):
def testmain(self):
self.assertTrue(main(5), 'foo')
如果您仍希望在主要内容中输入输入,则需要模拟补丁input
而不是main
。