有没有办法在django中测试大量raw_input的方法?

时间:2016-07-19 09:48:49

标签: python django

我在此处找到了此网址: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

2 个答案:

答案 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方法响应的串联。 请注意,代码未经过适当测试。