doctest: handle BdbQuit
Map `BdbQuit` exception to `outcomes.Exit`. This is necessary since we are not wrapping `pdb.set_trace` there, and therefore our `do_quit` is not called.
This commit is contained in:
parent
faf222f8fb
commit
63d517645c
|
@ -1,4 +1,5 @@
|
||||||
""" discover and run doctests in modules and test files."""
|
""" discover and run doctests in modules and test files."""
|
||||||
|
import bdb
|
||||||
import inspect
|
import inspect
|
||||||
import platform
|
import platform
|
||||||
import sys
|
import sys
|
||||||
|
@ -7,6 +8,7 @@ import warnings
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from _pytest import outcomes
|
||||||
from _pytest._code.code import ExceptionInfo
|
from _pytest._code.code import ExceptionInfo
|
||||||
from _pytest._code.code import ReprFileLocation
|
from _pytest._code.code import ReprFileLocation
|
||||||
from _pytest._code.code import TerminalRepr
|
from _pytest._code.code import TerminalRepr
|
||||||
|
@ -155,6 +157,8 @@ def _init_runner_class():
|
||||||
def report_unexpected_exception(self, out, test, example, exc_info):
|
def report_unexpected_exception(self, out, test, example, exc_info):
|
||||||
if isinstance(exc_info[1], Skipped):
|
if isinstance(exc_info[1], Skipped):
|
||||||
raise exc_info[1]
|
raise exc_info[1]
|
||||||
|
if isinstance(exc_info[1], bdb.BdbQuit):
|
||||||
|
outcomes.exit("Quitting debugger")
|
||||||
failure = doctest.UnexpectedException(test, example, exc_info)
|
failure = doctest.UnexpectedException(test, example, exc_info)
|
||||||
if self.continue_on_failure:
|
if self.continue_on_failure:
|
||||||
out.append(failure)
|
out.append(failure)
|
||||||
|
|
|
@ -458,7 +458,6 @@ class TestPDB:
|
||||||
def test_pdb_interaction_doctest(self, testdir, monkeypatch):
|
def test_pdb_interaction_doctest(self, testdir, monkeypatch):
|
||||||
p1 = testdir.makepyfile(
|
p1 = testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
import pytest
|
|
||||||
def function_1():
|
def function_1():
|
||||||
'''
|
'''
|
||||||
>>> i = 0
|
>>> i = 0
|
||||||
|
@ -477,9 +476,32 @@ class TestPDB:
|
||||||
|
|
||||||
child.sendeof()
|
child.sendeof()
|
||||||
rest = child.read().decode("utf8")
|
rest = child.read().decode("utf8")
|
||||||
|
assert "! _pytest.outcomes.Exit: Quitting debugger !" in rest
|
||||||
|
assert "BdbQuit" not in rest
|
||||||
assert "1 failed" in rest
|
assert "1 failed" in rest
|
||||||
self.flush(child)
|
self.flush(child)
|
||||||
|
|
||||||
|
def test_doctest_set_trace_quit(self, testdir, monkeypatch):
|
||||||
|
p1 = testdir.makepyfile(
|
||||||
|
"""
|
||||||
|
def function_1():
|
||||||
|
'''
|
||||||
|
>>> __import__('pdb').set_trace()
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
# NOTE: does not use pytest.set_trace, but Python's patched pdb,
|
||||||
|
# therefore "-s" is required.
|
||||||
|
child = testdir.spawn_pytest("--doctest-modules --pdb -s %s" % p1)
|
||||||
|
child.expect("Pdb")
|
||||||
|
child.sendline("q")
|
||||||
|
rest = child.read().decode("utf8")
|
||||||
|
|
||||||
|
assert "! _pytest.outcomes.Exit: Quitting debugger !" in rest
|
||||||
|
assert "= no tests ran in" in rest
|
||||||
|
assert "BdbQuit" not in rest
|
||||||
|
assert "UNEXPECTED EXCEPTION" not in rest
|
||||||
|
|
||||||
def test_pdb_interaction_capturing_twice(self, testdir):
|
def test_pdb_interaction_capturing_twice(self, testdir):
|
||||||
p1 = testdir.makepyfile(
|
p1 = testdir.makepyfile(
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue