2011-12-15 22 views
11

Tôi có một mô-đun python bên thứ ba bị lỗi được đầu ra để stdout hoặc stderr trong khi nó được nhập khẩu và điều này là phá vỡ đầu ra của unittests của tôi.Làm thế nào để tạm thời ẩn stdout hoặc stderr trong khi chạy một unittest trong Python

Làm cách nào để tạm thời chuyển hướng stdout để ẩn đầu ra của nó.

Giới hạn tới Python 2.5 cú pháp :)

Cập nhật, tôi quên đề cập đến rằng sys.stdoutsys.__stderr__ phương pháp này không làm việc trong trường hợp này. Theo như tôi biết mô-đun bị lỗi này đang sử dụng mã gốc.

Trả lời

16

Bạn có thể làm điều đó một cái gì đó như thế này:

>>> import sys, os 
>>> _stderr = sys.stderr 
>>> _stdout = sys.stdout 
>>> null = open(os.devnull,'wb') 
>>> sys.stdout = sys.stderr = null 
>>> print "Bleh" 
>>> sys.stderr = _stderr 
>>> sys.stdout = _stdout 
>>> print "Bleh" 
Bleh 
+6

'os.devnull', đã học được điều gì đó! +1 – juliomalegria

+0

Ví dụ của bạn sẽ hoạt động, tôi thậm chí đã cố gắng thay đổi 'sys .__ stdout__' và' sys .__ stderr__' nhưng tôi vẫn nhận được kết quả ': [' – sorin

20

Bạn cũng có thể sử dụng mock để cho bạn vá sys.stdoutsys.stderr cho bạn khi module được nhập khẩu. Một ví dụ về một mô-đun thử nghiệm rằng việc sử dụng chiến lược này sẽ là:

import os 
devnull = open(os.devnull, 'w') 

from mock import patch 
with patch('sys.stdout', devnull): 
    with patch('sys.stderr', devnull): 
     import bad_module 

# Test cases writen here 

nơi bad_module là module bên thứ ba đang in để sys.stdoutsys.stderr khi đang được nhập khẩu.

+0

Phần 'mock' này có hoạt động nếu' stdout' không đang được ghi vào trong quá trình nhập như OP được chỉ ra? – MattH

+0

@MattH Bạn nói đúng, ví dụ là sai. Tôi đã udpated câu trả lời của tôi để vá sys.stdout và sys.stderr chỉ khi module được nhập khẩu. Cảm ơn phản hồi của bạn. – jcollado

+0

+1 Thú vị, tôi không quen thuộc với 'mock'. Tôi đoán bạn không cần 'import unittest' nữa. – MattH

Các vấn đề liên quan