How can I simulate input to stdin for pyunit?

前端 未结 5 1007
清酒与你
清酒与你 2020-12-03 10:56

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 | .         


        
5条回答
  •  庸人自扰
    2020-12-03 11:28

    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
    

提交回复
热议问题