From e7b2861d54ffdad33b608ab248f4339a9fe78ae0 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Sun, 3 Nov 2019 22:10:53 +0100 Subject: [PATCH] pytester: reset log output in _match_lines This is necessary for when using e.g. `no_fnmatch_line` after it. Factor it out into `_fail`. --- src/_pytest/pytester.py | 40 +++++++++++++++++++++------------------- testing/test_pytester.py | 10 +++++++++- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index 2af99dbc333..ac9f82482b5 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -1421,10 +1421,10 @@ def _match_lines(self, lines2, match_func, match_nickname): self._log("{:>{width}}".format("and:", width=wnick), repr(nextline)) extralines.append(nextline) else: - self._log("remains unmatched: {!r}".format(line)) - pytest.fail( - self._log_text, short_msg="remains unmatched: {!r}".format(line) - ) + msg = "remains unmatched: {!r}".format(line) + self._log(msg) + self._fail(msg) + self._log_output = [] def no_fnmatch_line(self, pat): """Ensure captured lines do not match the given pattern, using ``fnmatch.fnmatch``. @@ -1450,18 +1450,20 @@ def _no_match_line(self, pat, match_func, match_nickname): __tracebackhide__ = True nomatch_printed = False wnick = len(match_nickname) + 1 - try: - for line in self.lines: - if match_func(line, pat): - self._log("%s:" % match_nickname, repr(pat)) - self._log("{:>{width}}".format("with:", width=wnick), repr(line)) - pytest.fail(self._log_text.lstrip()) - else: - if not nomatch_printed: - self._log( - "{:>{width}}".format("nomatch:", width=wnick), repr(pat) - ) - nomatch_printed = True - self._log("{:>{width}}".format("and:", width=wnick), repr(line)) - finally: - self._log_output = [] + for line in self.lines: + if match_func(line, pat): + msg = "{}: {!r}".format(match_nickname, pat) + self._log(msg) + self._log("{:>{width}}".format("with:", width=wnick), repr(line)) + self._fail(msg) + else: + if not nomatch_printed: + self._log("{:>{width}}".format("nomatch:", width=wnick), repr(pat)) + nomatch_printed = True + self._log("{:>{width}}".format("and:", width=wnick), repr(line)) + self._log_output = [] + + def _fail(self, msg): + log_text = self._log_text + self._log_output = [] + pytest.fail(log_text, short_msg=msg) diff --git a/testing/test_pytester.py b/testing/test_pytester.py index 5003d353174..6c0871db78e 100644 --- a/testing/test_pytester.py +++ b/testing/test_pytester.py @@ -545,7 +545,7 @@ def test_no_matching(function): ] else: assert obtained == [ - "nomatch: '{}'".format(good_pattern), + " nomatch: '{}'".format(good_pattern), " and: 'cachedir: .pytest_cache'", " and: 'collecting ... collected 1 item'", " and: ''", @@ -557,6 +557,14 @@ def test_no_matching(function): func(bad_pattern) # bad pattern does not match any line: passes +def test_no_matching_after_match(): + lm = LineMatcher(["1", "2", "3"]) + lm.fnmatch_lines(["1", "3"]) + with pytest.raises(pytest.fail.Exception) as e: + lm.no_fnmatch_line("*") + assert str(e.value).splitlines() == ["fnmatch: '*'", " with: '1'"] + + def test_pytester_addopts(request, monkeypatch): monkeypatch.setenv("PYTEST_ADDOPTS", "--orig-unused")