Skip to content

Commit

Permalink
Merge pull request #6086 from kondratyev-nv/master
Browse files Browse the repository at this point in the history
Fix line detection for properties in doctest tests
  • Loading branch information
blueyed authored Nov 22, 2019
2 parents 0601f5c + 5e09797 commit d1eb89d
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 5 deletions.
1 change: 1 addition & 0 deletions changelog/6082.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix line detection for doctest samples inside ``property`` docstrings, as a workaround to `bpo-17446 <https://bugs.python.org/issue17446>`__.
10 changes: 10 additions & 0 deletions src/_pytest/doctest.py
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,16 @@ class MockAwareDocTestFinder(doctest.DocTestFinder):
https://bugs.python.org/issue25532
"""

def _find_lineno(self, obj, source_lines):
"""
Doctest code does not take into account `@property`, this is a hackish way to fix it.
https://bugs.python.org/issue17446
"""
if isinstance(obj, property):
obj = getattr(obj, "fget", obj)
return doctest.DocTestFinder._find_lineno(self, obj, source_lines)

def _find(self, tests, obj, name, module, source_lines, globs, seen):
if _is_mocked(obj):
return
Expand Down
65 changes: 60 additions & 5 deletions testing/test_doctest.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,13 +287,68 @@ def test(self):
)
)
result = testdir.runpytest("--doctest-modules")
result.stdout.fnmatch_lines(
["*hello*", "006*>>> 1/0*", "*UNEXPECTED*ZeroDivision*", "*1 failed*"]
)

def test_doctest_linedata_on_property(self, testdir):
testdir.makepyfile(
"""
class Sample(object):
@property
def some_property(self):
'''
>>> Sample().some_property
'another thing'
'''
return 'something'
"""
)
result = testdir.runpytest("--doctest-modules")
result.stdout.fnmatch_lines(
[
"*hello*",
"*EXAMPLE LOCATION UNKNOWN, not showing all tests of that example*",
"*1/0*",
"*UNEXPECTED*ZeroDivision*",
"*1 failed*",
"*= FAILURES =*",
"*_ [[]doctest[]] test_doctest_linedata_on_property.Sample.some_property _*",
"004 ",
"005 >>> Sample().some_property",
"Expected:",
" 'another thing'",
"Got:",
" 'something'",
"",
"*/test_doctest_linedata_on_property.py:5: DocTestFailure",
"*= 1 failed in *",
]
)

def test_doctest_no_linedata_on_overriden_property(self, testdir):
testdir.makepyfile(
"""
class Sample(object):
@property
def some_property(self):
'''
>>> Sample().some_property
'another thing'
'''
return 'something'
some_property = property(some_property.__get__, None, None, some_property.__doc__)
"""
)
result = testdir.runpytest("--doctest-modules")
result.stdout.fnmatch_lines(
[
"*= FAILURES =*",
"*_ [[]doctest[]] test_doctest_no_linedata_on_overriden_property.Sample.some_property _*",
"EXAMPLE LOCATION UNKNOWN, not showing all tests of that example",
"[?][?][?] >>> Sample().some_property",
"Expected:",
" 'another thing'",
"Got:",
" 'something'",
"",
"*/test_doctest_no_linedata_on_overriden_property.py:None: DocTestFailure",
"*= 1 failed in *",
]
)

Expand Down

0 comments on commit d1eb89d

Please sign in to comment.