Как я могу проверить на стандартный вывод, используя поведение?
Я хотел бы создать приложение командной строки Hello World с BDD, используя python3 и вести себя. У меня есть файл функций, настроенный таким образом:
Feature: Hello World
Scenario: the program greets us
When I start the program
Then it prints "Hello World!"
В моем features/steps/hello.py
контур моего @Then
шаг это:
from behave import *
@then('it prints "{text}"')
def step_impl(context, text):
# what goes here???
Как я могу проверить вывод моей программы? Как я могу захватить стандартный вывод для этого теста?
2 ответа
Один из типичных способов проверить print
выход угнать sys.stdout
и проанализируем это:
from StringIO import StringIO
import sys
real_stdout = sys.stdout
try:
mock_stdout = StringIO()
sys.stdout = mock_stdout
print "Hi there"
assert mock_stdout.getvalue() == "Hi there"
finally:
sys.stdout = real_stdout
Конечно, логика try/finally может быть неявной в используемой вами инфраструктуре тестирования. В unittest
, это было бы setUp
/ tearDown
; Я понятия не имею о behave
но его документы, вероятно, покрывают это.
Вот идея 9000, применяемая для поведения:
Я перенаправить стандартный вывод на макет в файле с именем features/environment.py
:
import sys
import io
def before_all(context):
context.real_stdout = sys.stdout
context.stdout_mock = io.StringIO()
sys.stdout = context.stdout_mock
def after_all(context):
sys.stdout = context.real_stdout
А потом в features/steps/hello.py
Я утверждаю на содержание макета stdout:
@then('it prints "{text}"')
def step_impl(context, text):
output = context.stdout_mock.getvalue()
assertEqual( "Hello World!\n", output )