diff --git a/changelog/6566.bugfix.rst b/changelog/6566.bugfix.rst new file mode 100644 index 000000000..4af976f22 --- /dev/null +++ b/changelog/6566.bugfix.rst @@ -0,0 +1 @@ +Fix ``EncodedFile.writelines`` to call the underlying buffer's ``writelines`` method. diff --git a/src/_pytest/capture.py b/src/_pytest/capture.py index c79bfeef0..e51fe2b67 100644 --- a/src/_pytest/capture.py +++ b/src/_pytest/capture.py @@ -9,6 +9,7 @@ import os import sys from io import UnsupportedOperation from tempfile import TemporaryFile +from typing import List import pytest from _pytest.compat import CaptureIO @@ -426,9 +427,8 @@ class EncodedFile: ) return self.buffer.write(obj) - def writelines(self, linelist): - data = "".join(linelist) - self.write(data) + def writelines(self, linelist: List[str]) -> None: + self.buffer.writelines([x.encode(self.encoding, "replace") for x in linelist]) @property def name(self): diff --git a/testing/test_capture.py b/testing/test_capture.py index 7d459e91c..ebe30703b 100644 --- a/testing/test_capture.py +++ b/testing/test_capture.py @@ -1497,3 +1497,15 @@ def test_typeerror_encodedfile_write(testdir): def test_stderr_write_returns_len(capsys): """Write on Encoded files, namely captured stderr, should return number of characters written.""" assert sys.stderr.write("Foo") == 3 + + +def test_encodedfile_writelines(tmpfile) -> None: + ef = capture.EncodedFile(tmpfile, "utf-8") + with pytest.raises(AttributeError): + ef.writelines([b"line1", b"line2"]) # type: ignore[list-item] # noqa: F821 + assert ef.writelines(["line1", "line2"]) is None # type: ignore[func-returns-value] # noqa: F821 + tmpfile.seek(0) + assert tmpfile.read() == b"line1line2" + tmpfile.close() + with pytest.raises(ValueError): + ef.read()