Su mejor apuesta es, probablemente, la inyección de dependencias, de manera que lo que se recoge normalmente a partir sys.stdin (por ejemplo) es en realidad un objeto pasado en Así que se podría hacer algo como esto:.
import sys
def myapp(stdin, stdout):
print >> stdout, "Hi, what's your name?"
name = stdin.readline()
print >> stdout "Hi,", name
# This might be in a separate test module
def test_myapp():
mock_stdin = [create mock object that has .readline() method]
mock_stdout = [create mock object that has .write() method]
myapp(mock_stdin, mock_stdout)
if __name__ == '__main__':
myapp(sys.stdin, sys.stdout)
Afortunadamente, Python lo hace bastante fácil. Aquí hay un enlace más detallado para un ejemplo de stdin burlón: http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html
De hecho, la inyección de dependencia es el camino a seguir. Aunque, por alguna extraña razón, no puede cambiar el código, puede cambiar 'stdin' y' stdout' directamente con 'sys.stdin = mock_stdin' y' sys.stdout = mock_stdout'. Si necesitaba los originales durante la prueba, podría usar 'sys .__ stdin__' y' sys .__ stdout__', que conservan los valores originales. – PaoloVictor