Запатентованный stdin в unittest не имеет записанной строки - PullRequest
0 голосов
/ 08 июля 2019

Если у меня есть unittest.TestCase, я пытаюсь исправить sys.stdin на самой функции:

@patch('sys.stdin', new_callable=StringIO)
def test_bla(mocked_stdin):
   mocked_stdin.write("TEST")

   a = MyClass()
   a.do_stuff_with_stdin()

Как ни странно, тогда, если мы попытаемся получить доступ к sys.stdin из этого класса,только что написанное не для чтения:

import sys

def do_stuff_with_stdin():
    r = sys.stdin.read()
    # r = ""

Но sys.stdin был заменен экземпляром StringIO.Так что насмешка сработала, просто содержимое пустое.

Я запускаю эти тесты, используя pytest.

1 Ответ

0 голосов
/ 08 июля 2019

После того, как я это записал, я нашел одно решение, но я не совсем уверен, почему это работает.

Я перемещаю патч в класс и создаю экземпляр StringIO непосредственно с данными, которые должныбыть там:

with patch('sys.stdin', StringIO(data)):
    a = MyClass()
    a.do_stuff_with_stdin()

Кажется, это работает, но я немного сбит с толку, почему это так.

Обновление: Я понимаю, почему это работает(благодаря @ комментарию hoefling ), потому что в этом случае StringIO инициализируется с буфером, но: «В обоих случаях начальная позиция файла начинается с нуля».

...