Testing interactive code using raw_input
Peter Otten
__peter__ at web.de
Mon Mar 10 12:57:19 EDT 2014
Steven D'Aprano wrote:
> Does anyone have any good hints for testing interactive code that uses
> raw_input, or input in Python 3?
>
> A simple technique would be to factor out the interactive part, e.g. like
> this:
>
> # Before
> def spam():
> answer = raw_input(prompt)
> return eggs(answer) + cheese(answer) + toast(answer)
>
> # After
> def spam():
> answer = raw_input(prompt)
> return func(answer)
>
> def func(s):
> return eggs(s) + cheese(s) + toast(s)
>
>
>
> and then test func. But how about times where it is inconvenient to
> factor out the raw_input stuff out of the function? E.g. suppose you have
> a function that takes some arguments, gathers some more values
> interactively, processes the lot, and then returns a result. With an
> automated test, I can provide the arguments, and check the result, but
> what are my options for *automatically* supplying input to raw_input?
https://pypi.python.org/pypi/mock
In Python 3 this is part of the standard library:
from unittest import mock
def sum_it():
return "{} + {} = {}".format(input(), input(), input())
with mock.patch('builtins.input', side_effect="123"):
assert sum_it() == "1 + 2 = 3"
I have not yet used it myself so far; instead I did something like
def sum_it(input=input):
...
and then passed a hand-crafted mock input function to increase coverage.
More information about the Python-list
mailing list