Как я могу проверить на стандартный вывод, используя поведение?

Я хотел бы создать приложение командной строки 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 )
Другие вопросы по тегам