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()?
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.
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.
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 !   $ 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 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With