@@ -309,6 +309,9 @@ class CaptureFixture(object):
309
309
def __init__ (self , captureclass , request ):
310
310
self .captureclass = captureclass
311
311
self .request = request
312
+ self ._capture = None
313
+ self ._captured_out = self .captureclass .EMPTY_BUFFER
314
+ self ._captured_err = self .captureclass .EMPTY_BUFFER
312
315
313
316
def _start (self ):
314
317
self ._capture = MultiCapture (
@@ -317,20 +320,26 @@ def _start(self):
317
320
self ._capture .start_capturing ()
318
321
319
322
def close (self ):
320
- cap = self .__dict__ .pop ("_capture" , None )
321
- if cap is not None :
322
- self ._outerr = cap .pop_outerr_to_orig ()
323
- cap .stop_capturing ()
323
+ if self ._capture is not None :
324
+ out , err = self ._capture .pop_outerr_to_orig ()
325
+ self ._captured_out += out
326
+ self ._captured_err += err
327
+ self ._capture .stop_capturing ()
328
+ self ._capture = None
324
329
325
330
def readouterr (self ):
326
331
"""Read and return the captured output so far, resetting the internal buffer.
327
332
328
333
:return: captured content as a namedtuple with ``out`` and ``err`` string attributes
329
334
"""
330
- try :
331
- return self ._capture .readouterr ()
332
- except AttributeError :
333
- return self ._outerr
335
+ captured_out , captured_err = self ._captured_out , self ._captured_err
336
+ if self ._capture is not None :
337
+ out , err = self ._capture .readouterr ()
338
+ captured_out += out
339
+ captured_err += err
340
+ self ._captured_out = self .captureclass .EMPTY_BUFFER
341
+ self ._captured_err = self .captureclass .EMPTY_BUFFER
342
+ return CaptureResult (captured_out , captured_err )
334
343
335
344
@contextlib .contextmanager
336
345
def _suspend (self ):
@@ -463,6 +472,7 @@ def readouterr(self):
463
472
464
473
465
474
class NoCapture (object ):
475
+ EMPTY_BUFFER = None
466
476
__init__ = start = done = suspend = resume = lambda * args : None
467
477
468
478
@@ -472,6 +482,8 @@ class FDCaptureBinary(object):
472
482
snap() produces `bytes`
473
483
"""
474
484
485
+ EMPTY_BUFFER = bytes ()
486
+
475
487
def __init__ (self , targetfd , tmpfile = None ):
476
488
self .targetfd = targetfd
477
489
try :
@@ -545,6 +557,8 @@ class FDCapture(FDCaptureBinary):
545
557
snap() produces text
546
558
"""
547
559
560
+ EMPTY_BUFFER = str ()
561
+
548
562
def snap (self ):
549
563
res = FDCaptureBinary .snap (self )
550
564
enc = getattr (self .tmpfile , "encoding" , None )
@@ -554,6 +568,9 @@ def snap(self):
554
568
555
569
556
570
class SysCapture (object ):
571
+
572
+ EMPTY_BUFFER = str ()
573
+
557
574
def __init__ (self , fd , tmpfile = None ):
558
575
name = patchsysdict [fd ]
559
576
self ._old = getattr (sys , name )
@@ -591,6 +608,8 @@ def writeorg(self, data):
591
608
592
609
593
610
class SysCaptureBinary (SysCapture ):
611
+ EMPTY_BUFFER = bytes ()
612
+
594
613
def snap (self ):
595
614
res = self .tmpfile .buffer .getvalue ()
596
615
self .tmpfile .seek (0 )
0 commit comments