diff --git a/AUTHORS b/AUTHORS index 805507a35..cd9678b3f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -93,6 +93,7 @@ Kevin Cox Kodi B. Arfer Lee Kamentsky Lev Maximov +Llandy Riveron Del Risco Loic Esteve Lukas Bednar Luke Murphy @@ -168,3 +169,4 @@ Vitaly Lashmanov Vlad Dragos Wouter van Ackooy Xuecong Liao +Zoltán Máté diff --git a/_pytest/compat.py b/_pytest/compat.py index 9cebbb974..45f9f86d4 100644 --- a/_pytest/compat.py +++ b/_pytest/compat.py @@ -282,7 +282,15 @@ def _setup_collect_fakemodule(): if _PY2: - from py.io import TextIO as CaptureIO + # Without this the test_dupfile_on_textio will fail, otherwise CaptureIO could directly inherit from StringIO. + from py.io import TextIO + + class CaptureIO(TextIO): + + @property + def encoding(self): + return getattr(self, '_encoding', 'UTF-8') + else: import io diff --git a/changelog/2375.trivial b/changelog/2375.trivial new file mode 100644 index 000000000..a73ab6ccf --- /dev/null +++ b/changelog/2375.trivial @@ -0,0 +1 @@ +Provides encoding attribute on CaptureIO. diff --git a/testing/test_capture.py b/testing/test_capture.py index a5d8c9c13..7380ad654 100644 --- a/testing/test_capture.py +++ b/testing/test_capture.py @@ -355,7 +355,7 @@ class TestLoggingInteraction(object): """) result = testdir.runpytest_subprocess( p, "--traceconfig", - "-p", "no:capturelog") + "-p", "no:capturelog", "-p", "no:hypothesis", "-p", "no:hypothesispytest") assert result.ret != 0 result.stdout.fnmatch_lines([ "*hello432*", @@ -1040,6 +1040,15 @@ def test_capture_not_started_but_reset(): capsys.stop_capturing() +def test_using_capsys_fixture_works_with_sys_stdout_encoding(capsys): + test_text = 'test text' + + print(test_text.encode(sys.stdout.encoding, 'replace')) + (out, err) = capsys.readouterr() + assert out + assert err == '' + + @needsosdup @pytest.mark.parametrize('use', [True, False]) def test_fdcapture_tmpfile_remains_the_same(tmpfile, use):