diff --git a/AUTHORS b/AUTHORS index f4a21b22d..76726af2b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -79,6 +79,7 @@ Ross Lawley Ryan Wooden Samuele Pedroni Tom Viner +Thomas Grainger Trevor Bekolay Wouter van Ackooy David Díaz-Barquero diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2be8c9aae..4783395a8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,12 +3,18 @@ **Bug Fixes** -* +* Text documents without any doctests no longer appear as "skipped". + Thanks `@graingert`_ for reporting and providing a full PR (`#1580`_). * * +.. _#1580: https://github.com/pytest-dev/pytest/issues/1580 + +.. _@graingert: https://github.com/graingert + + 2.9.2 ===== diff --git a/_pytest/doctest.py b/_pytest/doctest.py index a57f7a494..72b94f488 100644 --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -144,20 +144,18 @@ def get_optionflags(parent): return flag_acc -class DoctestTextfile(DoctestItem, pytest.Module): +class DoctestTextfile(pytest.Module): + obj = None - def runtest(self): + def collect(self): import doctest - fixture_request = _setup_fixtures(self) # inspired by doctest.testfile; ideally we would use it directly, # but it doesn't support passing a custom checker text = self.fspath.read() filename = str(self.fspath) name = self.fspath.basename - globs = dict(getfixture=fixture_request.getfuncargvalue) - if '__name__' not in globs: - globs['__name__'] = '__main__' + globs = {'__name__': '__main__'} optionflags = get_optionflags(self) runner = doctest.DebugRunner(verbose=0, optionflags=optionflags, @@ -165,8 +163,8 @@ class DoctestTextfile(DoctestItem, pytest.Module): parser = doctest.DocTestParser() test = parser.get_doctest(text, globs, name, filename, 0) - _check_all_skipped(test) - runner.run(test) + if test.examples: + yield DoctestItem(test.name, self, runner, test) def _check_all_skipped(test): diff --git a/testing/test_doctest.py b/testing/test_doctest.py index a4821ee4c..816f069d3 100644 --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -14,13 +14,16 @@ class TestDoctests: >>> i-1 4 """) + for x in (testdir.tmpdir, checkfile): #print "checking that %s returns custom items" % (x,) items, reprec = testdir.inline_genitems(x) assert len(items) == 1 - assert isinstance(items[0], DoctestTextfile) + assert isinstance(items[0], DoctestItem) + assert isinstance(items[0].parent, DoctestTextfile) + # Empty file has no items. items, reprec = testdir.inline_genitems(w) - assert len(items) == 1 + assert len(items) == 0 def test_collect_module_empty(self, testdir): path = testdir.makepyfile(whatever="#") @@ -595,6 +598,11 @@ class TestDoctestSkips: reprec = testdir.inline_run("--doctest-modules") reprec.assertoutcome(skipped=1) + def test_vacuous_all_skipped(self, testdir, makedoctest): + makedoctest('') + reprec = testdir.inline_run("--doctest-modules") + reprec.assertoutcome(passed=0, skipped=0) + class TestDoctestAutoUseFixtures: