Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I simulate input to stdin for pyunit?

Tags:

I'm trying to test a function that takes input from stdin, which I'm currently testing with something like this:

cat /usr/share/dict/words | ./spellchecker.py 

In the name of test automation, is there any way that pyunit can fake input to raw_input()?

like image 488
bejar37 Avatar asked Jun 07 '11 21:06

bejar37


People also ask

How does Stdin work in Python?

Python sys module stdin is used by the interpreter for standard input. Internally, it calls the input() function. The input string is appended with a newline character (\n) in the end. So, you can use the rstrip() function to remove it.


1 Answers

The short answer is to monkey patch raw_input().

There are some good examples in the answer to How to display the redirected stdin in Python?

Here is a simple, trivial example using a lambda that throws away the prompt and returns what we want.

System Under Test

cat ./name_getter.py #!/usr/bin/env python  class NameGetter(object):      def get_name(self):         self.name = raw_input('What is your name? ')      def greet(self):         print 'Hello, ', self.name, '!'      def run(self):         self.get_name()         self.greet()  if __name__ == '__main__':     ng = NameGetter()     ng.run()  $ echo Derek | ./name_getter.py  What is your name? Hello,  Derek ! 

Test case:

$ cat ./t_name_getter.py #!/usr/bin/env python  import unittest import name_getter  class TestNameGetter(unittest.TestCase):      def test_get_alice(self):         name_getter.raw_input = lambda _: 'Alice'         ng = name_getter.NameGetter()         ng.get_name()         self.assertEquals(ng.name, 'Alice')      def test_get_bob(self):         name_getter.raw_input = lambda _: 'Bob'         ng = name_getter.NameGetter()         ng.get_name()         self.assertEquals(ng.name, 'Bob')  if __name__ == '__main__':     unittest.main()  $ ./t_name_getter.py -v test_get_alice (__main__.TestNameGetter) ... ok test_get_bob (__main__.TestNameGetter) ... ok  ---------------------------------------------------------------------- Ran 2 tests in 0.000s  OK 
like image 113
Johnsyweb Avatar answered Oct 11 '22 13:10

Johnsyweb