Fix collection error when tests is specified with --doctest-modules

The problem was that _matchnodes would receive two items: [DoctestModule, Module]. It would then collect the first one, *cache it*, and fail to match against the name in the command line. Next, it would reuse the cached item (DoctestModule) instead of collecting the Module which would eventually find the "test" name on it.

Added the type of the node to the cache key to avoid this problem, although I'm not a big fan of caches that have different key types.

Fix #3843
This commit is contained in:
Bruno Oliveira 2018-08-21 20:55:45 -03:00
parent f1079a8222
commit 07a560ff24
3 changed files with 15 additions and 3 deletions

View File

@ -0,0 +1 @@
Fix collection error when specifying test functions directly in the command line using ``test.py::test`` syntax together with ``--doctest-module``.

View File

@ -625,11 +625,12 @@ class Session(nodes.FSCollector):
resultnodes.append(node) resultnodes.append(node)
continue continue
assert isinstance(node, nodes.Collector) assert isinstance(node, nodes.Collector)
if node.nodeid in self._node_cache: key = (type(node), node.nodeid)
rep = self._node_cache[node.nodeid] if key in self._node_cache:
rep = self._node_cache[key]
else: else:
rep = collect_one_node(node) rep = collect_one_node(node)
self._node_cache[node.nodeid] = rep self._node_cache[key] = rep
if rep.passed: if rep.passed:
has_matched = False has_matched = False
for x in rep.result: for x in rep.result:

View File

@ -660,6 +660,16 @@ class TestInvocationVariants(object):
["*test_world.py::test_other*PASSED*", "*1 passed*"] ["*test_world.py::test_other*PASSED*", "*1 passed*"]
) )
def test_invoke_test_and_doctestmodules(self, testdir):
p = testdir.makepyfile(
"""
def test():
pass
"""
)
result = testdir.runpytest(str(p) + "::test", "--doctest-modules")
result.stdout.fnmatch_lines(["*1 passed*"])
@pytest.mark.skipif(not hasattr(os, "symlink"), reason="requires symlinks") @pytest.mark.skipif(not hasattr(os, "symlink"), reason="requires symlinks")
def test_cmdline_python_package_symlink(self, testdir, monkeypatch): def test_cmdline_python_package_symlink(self, testdir, monkeypatch):
""" """