diff --git a/_pytest/capture.py b/_pytest/capture.py index 2d93c64d6..778b1396b 100644 --- a/_pytest/capture.py +++ b/_pytest/capture.py @@ -81,11 +81,11 @@ class CaptureManager: def _getcapture(self, method): if method == "fd": - return StdCaptureBase(out=True, err=True, Capture=FDCapture) + return MultiCapture(out=True, err=True, Capture=FDCapture) elif method == "sys": - return StdCaptureBase(out=True, err=True, Capture=SysCapture) + return MultiCapture(out=True, err=True, Capture=SysCapture) elif method == "no": - return StdCaptureBase(out=False, err=False, in_=False) + return MultiCapture(out=False, err=False, in_=False) else: raise ValueError("unknown capturing method: %r" % method) @@ -235,7 +235,7 @@ class CaptureFixture: self.captureclass = captureclass def _start(self): - self._capture = StdCaptureBase(out=True, err=True, in_=False, + self._capture = MultiCapture(out=True, err=True, in_=False, Capture=self.captureclass) self._capture.start_capturing() @@ -289,7 +289,7 @@ class EncodedFile(object): return getattr(self.buffer, name) -class StdCaptureBase(object): +class MultiCapture(object): out = err = in_ = None def __init__(self, out=True, err=True, in_=True, Capture=None): diff --git a/testing/test_capture.py b/testing/test_capture.py index 4175d243b..33f538890 100644 --- a/testing/test_capture.py +++ b/testing/test_capture.py @@ -46,10 +46,10 @@ def oswritebytes(fd, obj): def StdCaptureFD(out=True, err=True, in_=True): - return capture.StdCaptureBase(out, err, in_, Capture=capture.FDCapture) + return capture.MultiCapture(out, err, in_, Capture=capture.FDCapture) def StdCapture(out=True, err=True, in_=True): - return capture.StdCaptureBase(out, err, in_, Capture=capture.SysCapture) + return capture.MultiCapture(out, err, in_, Capture=capture.SysCapture) class TestCaptureManager: @@ -918,7 +918,7 @@ class TestStdCaptureFDinvalidFD: import os from _pytest import capture def StdCaptureFD(out=True, err=True, in_=True): - return capture.StdCaptureBase(out, err, in_, + return capture.MultiCapture(out, err, in_, Capture=capture.FDCapture) def test_stdout(): os.close(1) @@ -958,6 +958,25 @@ def test_fdcapture_tmpfile_remains_the_same(tmpfile, use): capfile2 = cap.err.tmpfile assert capfile2 == capfile +@needsosdup +def test_close_and_capture_again(testdir): + testdir.makepyfile(""" + import os + def test_close(): + os.close(1) + def test_capture_again(): + os.write(1, "hello\\n") + assert 0 + """) + result = testdir.runpytest() + result.stdout.fnmatch_lines(""" + *test_capture_again* + *assert 0* + *stdout* + *hello* + """) + + @pytest.mark.parametrize('method', ['SysCapture', 'FDCapture']) def test_capturing_and_logging_fundamentals(testdir, method): @@ -968,7 +987,7 @@ def test_capturing_and_logging_fundamentals(testdir, method): import sys, os import py, logging from _pytest import capture - cap = capture.StdCaptureBase(out=False, in_=False, + cap = capture.MultiCapture(out=False, in_=False, Capture=capture.%s) cap.start_capturing()