2017-01-22 7 views
0

В pytest (3.04; python 3.4) Я пытаюсь отключить вывод вывода при определенных обстоятельствах. Я пытаюсь следовать примеру на this doc page. Однако я не могу указать capsys как funcarg. В качестве продолжения я хотел бы принять аргументы funcarg и on-funcarg, чтобы я мог использовать метод класса, который принимает один или несколько нормальных аргументов. Как я могу это сделать?В pytest как временно отключить захват в методе класса?

В идеале, этот метод будет работать класс:

def always_print(self, message, capsys): 
     with capsys.disabled(): 
      print(message) 

Но, я даже не могу получить эту работу:

def always_print(capsys): 
    with capsys.disabled(): 
     print('FIXME') 

Получение ошибки:

... 
>  always_print() 
E  TypeError: always_print() missing 1 required positional argument: 'capsys' 

Редактировать 1: Ответ Петра решил мои конкретные c выпуск. Тем не менее, я также обнаружил два важных предостережений, что я не определена в документации или других сообщений, поэтому делиться здесь пользы других'S:

  1. это кажется, что capsys.disabled() применяется только на стандартный вывод и не stderr, где я первоначально отправлял свои отладочные сообщения за лучшую практику.
  2. Если вы установили дескриптор файла в sys.stdout до, вызывая capys.disabled(), то из-за того, что файловый дескриптор файла работает с этим pytest, это не сработает.

Так, к примеру, вам нужно сделать это таким образом (например, если ваш kwargs может содержать дополнительный «файл» ключевое слово, как встроенный в печати() делает:

fhandle = kwargs.get('file', sys.stdout) #will not work! 
    with capsys.disabled(): 
     fhandle = kwargs.get('file', sys.stdout) #must be in context 
     print(message, file=fhandle) 

ответ

1

Ну, capsys является встроенным в приспособлении для испытаний. вы должны получить его в качестве аргумента теста, и передать его дальше

def always_print(capsys): 
    with capsys.disabled(): 
     print('FIXME') 

def test_always_print(capsys): 
    always_print(capsys) 

это будет работать, если вы запустите его с pytest команды.

Edit:

Чтобы избежать многословия, вы можете подготовить некоторые глобальные capsys переменную для всех тестов (на основе ответа how to share a variable across modules for all tests in py.test):

# globals.py 
capsys = None 

# conftest.py 
import pytest 
import globals as gbl 
from _pytest.capture import capsys 

@pytest.fixture(autouse=True) 
def populate_globals(request): 
    gbl.capsys = capsys(request) 

# my_tests.py 
import globals as gbl 

def test_foo(): 
    with gbl.capsys.disabled(): 
     print('You can see me') 

def test_bar(): 
    with gbl.capsys.disabled(): 
     print('You can see me too') 
+0

я вижу. Благодарю. Но это означает, что мне нужно добавить capys funcarg для каждого из моих тестов, чтобы передать его методу print_always. Я бы предпочел не делать этого, потому что это много лишних подробностей. Какие-либо предложения? – JJC

+1

@JJC Привет, приятель, я отредактировал ответ и добавил решение, чтобы избежать лишних подробностей. –

+1

Спасибо! Использование глобального модуля - это, пожалуй, немного клочья, но он выполняет свою работу и избегает добавления большого количества шума к моим тестовым функциям. Я обнаружил два важных оговорки, пытаясь заставить это работать, что раньше не встречалось в документации. Я добавил их. [Dzięki Piotrze! :)] – JJC

 Смежные вопросы

  • Нет связанных вопросов^_^