Как смоделировать некоторые функции внутри модуля, который я хочу импортировать? - PullRequest
3 голосов
/ 10 марта 2020

ВНИМАНИЕ! Эта ситуация возникла из-за ошибки. Проверьте мой ответ.

У меня есть файл python (myfile.py), который я хочу протестировать с помощью Pytest. (Содержание динамически меняется)
Я написал этот код:

import importlib

def test_myfile(capsys, monkeypatch):
    monkeypatch.setattr('builtins.input', lambda s: "some_input")

    # Create a module from the custom Problem file and import it
    my_module = importlib.import_module("myfile")

    # Rest of the test script

, когда я запускаю тест, я получаю эту ошибку:

OSError: reading from stdin while output is captured

Ошибка имеет был создан потому, что в myfile.py есть инструкция input(), и это означает, что проверять эту функцию бесполезно.

Мой вопрос:
Как мне макетировать некоторые функции внутри модуля, который я хочу импортировать?

1 Ответ

0 голосов
/ 21 марта 2020

Наконец я обнаружил, что искал не то место, чтобы найти решение.
на самом деле я использую pytest, чтобы проверить ответ учащегося и оценить его. это был способ, которым я сделал это в тот момент, когда я задал этот вопрос.

py.test test_runner.py test_case.py -v

Это проверит ответ пользователя, сохраненный в test_case.py (я получаю второй параметр внутри моего метода тестирования и загружаю его содержание и, например, запустить нужную функцию). Затем я изучал отчет Pytest, чтобы увидеть, была ли ошибка или не удалось решить вопрос о результате. (проход / сбой) обычно pytest завершался неудачей, если в коде пользователя была ошибка (например, синтаксическая ошибка) или если тест не удался (например, не вернул то, что должен вернуть)

На этот раз произошла ошибка ошибка, которую я не хотел, чтобы остановить тест. Я хочу макетировать input() функцию в коде пользователя. когда я выполнял команду, перед запуском моего метода тестирования pytest импортировал оба файла для сбора методов тестирования. Не удалось импортировать test_case.py из-за функции input(). Он даже не дошел до строки, которую я попросил смоделировать, и потерпел неудачу на этапе инициализации.

Наконец, чтобы решить проблему, я добавил параметр в py.test, и теперь я запускаю тестовый процесс например:

py.test test_runner.py --program test_case.py -v

В этой форме pytest не ищет в test_case.py методы тестирования и не терпит неудачу.

надеюсь, что этот опыт поможет кому-то еще

...