我在此处找到了此网址:python mocking raw input in unittests
它在某种程度上回答了我的问题,但是当有很多raw_inputs时呢?像这样......
class MyModel()
def my_method(self):
raw_input("do you want to play a game?: ")
...do something
raw_input("Do you want to do something else?: ")
...do something
答案 0 :(得分:1)
简单回答:将每个对raw_input()
的调用包装在您可以轻松模拟的不同对象中。
答案 1 :(得分:1)
如果我理解正确,您想要模拟每个raw_input
方法,但设置不同的返回值。 unittest.mock
提供了side_effect
个属性。在这种情况下可能会有所帮助。
https://docs.python.org/3/library/unittest.mock.html#quick-guide
Python Mock object with method called multiple times
这里的关键点是raw_input
函数的参数。
示例:
from unittest import mock
from unittest import TestCase
class MyTest(TestCase):
@mock.patch.object(__builtins__, 'raw_input')
def test_my_method(self, mock_input):
# If raw_input called thrice in the my_method
mock_input.side_effect = lambda param: {'First': 'Great', 'Second': 'Good', 'Third':
'Awesome'}.get(param, 'Default return')
my_class = actual_module.MyModel()
self.assertEqual(my_class.my_method(), 'GreatGoodAwesome')
这里'第一','第二''第三'是方法中使用的raw_input的实际字符串。 因此,您唯一需要修改的是将'First'替换为'你想玩游戏吗?:'等等。
假设my_method
返回raw_input方法响应的串联。
请注意,代码未经过适当测试。