2017-01-22 56 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: Piotr的答案解決了我的具體問題c問題。不過,我也發現,我並沒有在文檔或其他職位回升,所以在這裏分享他人的利益的兩個重要注意事項:

  1. 似乎capsys.disabled()只適用於stdout和 stderr,這是我最初發送每個* nix最佳實踐的調試消息的地方。
  2. 如果您在調用capsys.disabled()之前將文件句柄設置爲sys.stdout 之前,那麼由於pytest所執行的魔術文件discriptor變形,這不起作用。

因此,舉例來說,你需要做這種方式(比如,如果你的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命令來運行它,它會工作。

編輯:

爲了避免冗長,可以準備所有測試(基於答案how to share a variable across modules for all tests in py.test)一些全局變量capsys

# 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

我明白了。謝謝。但是這意味着我需要將capsys funcarg添加到每個測試中,只是將它傳遞給print_always方法。我寧願不必這樣做,因爲它有很多額外的冗長。有什麼建議麼? – JJC

+1

@JJC你好,我編輯了答案並添加了解決方案以避免冗長。 –

+1

謝謝!使用全局模塊可能有點混亂,但它可以完成工作並避免爲我的測試功能添加大量噪音。我發現了兩個重要的警告,試圖讓這個工作成爲我之前在文檔中沒有遇到過的。我已經添加了它們。 [DziękiPiotrze! :)] – JJC

相關問題