在单元测试中处理输入,测试开始,但没有其他反应

时间:2019-05-21 10:49:52

标签: python-3.x unit-testing

我需要测试一个处理输入的函数。我在单元测试和模拟方面都是新手,因此我基本上只是遵循这个答案https://stackoverflow.com/a/21047132/6531256,它看起来与我的情况非常相似。 好吧,问题在于,当我运行测试时,它似乎开始了,但是只是停留在那里而没有任何反应。我需要退出ctrl-c才能停止它,然后我得到的回溯没有太大帮助(至少对我而言)。

这是测试代码:

ERROR:  more than one row returned by a subquery used as an expression

********** Error **********

ERROR: more than one row returned by a subquery used as an expression
SQL state: 21000

这里是要测试的功能:

activity.recreate(

以下是回溯的一个示例(总是有些不同):

import unittest
import unittest.mock
from unittest.mock import patch
from work1 import User

class TestWork1(unittest.TestCase, User):

    @patch('builtins.input', return_value= "36")
    def test_userNum(self,return_value):

        self.assertEqual(self.userNum(), "Invalid number. Put a 4-digit number:")


if __name__ == "__main__":
    unittest.main()

有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您的代码有几个问题:

  1. 您的循环无限运行,因为您对builtin.input进行了修补以始终返回"36"。这将不允许循环退出-当您运行代码时,似乎什么也没发生,但是代码只是循环而已。要查看会发生什么,可以将print()语句放在有趣的地方。要解决此问题,您必须定义return_value使其返回4位数字,或者必须将side_effect定义为类似于["36", "1234"]的列表,以便连续调用{ {1}}返回不同的值。后一个选项显示在下面的代码示例中。
  2. 您的断言将builtin.input的结果与字符串进行比较。但是,self.userNum()不返回任何内容。从测试代码看来,您似乎想测试self.userNum()是用各自的参数字符串调用的。下面的代码显示了如何完成此操作-作为一种可能的解决方案,其中实际上检查了对buitin.input的整个调用序列。这仅是为了演示,并不意味着应该这样做。

可能的解决方案:

builtin.input