Ввод Pytest, который переопределяется в другом модуле - PullRequest
0 голосов
/ 28 января 2020

Я написал модуль python, который гарантирует, что некоторый пользовательский ввод имеет определенный тип данных.

pcinput.py

def getFloat( prompt ):
    while True:
        try:
            num = float( input( prompt ) )
        except ValueError:
            print( "Not a number -- try again" )
            continue
        return num


def getInteger( prompt ):
    while True:
        try:
            num = int( input( prompt ) )
        except ValueError:
            print( "Not an integer -- try again" )
            continue
        return num

Первая функция используется в следующий файл.

pythagoras.py

from math import sqrt
from pcinput import getFloat

def main():
    a = getFloat("Give the length of the first leg: ")
    b = getFloat("Give the length of the second leg: ")
    print("A right-angled triangle with legs", a, "and", b, "has an hypotenuse of",
          sqrt(a ** 2 + b ** 2))


if __name__ == '__main__':
    main()

Я написал тестовый файл для своего кода pythagoras.

test_pythagoras.py

import pythagoras


def test1(capsys):
    input_values = [3, 4]
    def mock_input(s):
        return input_values.pop(0)
    pythagoras.input = mock_input
    pythagoras.main()
    out, err = capsys.readouterr()
    assert out == 'A right-angled triangle with legs 3.0 and 4.0 has an hypothenuse of 5.0\n'
    assert err == ''

Когда я запускаю «pytest test_pythagors.py» в командной строке, я получаю следующее сообщение об ошибке.

OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.

Кажется, это вызвано функцией getFloat. Если я заменю getFloat на float (input ()), ошибка исчезнет. Может кто-нибудь помочь мне исправить / настроить тестовый файл, не удаляя getFloat?

...