Skip to content

Commit bb6414e

Browse files
authored
Merge pull request #415 from AntoineDao/generate-missing-parsers
Fix generate-missing for steps with parsers
2 parents e76c0cd + 9a9201a commit bb6414e

File tree

2 files changed

+66
-6
lines changed

2 files changed

+66
-6
lines changed

pytest_bdd/generation.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,16 @@ def _find_step_fixturedef(fixturemanager, item, name, type_):
116116
117117
:return: Step function.
118118
"""
119-
fixturedefs = fixturemanager.getfixturedefs(get_step_fixture_name(name, type_), item.nodeid)
120-
if not fixturedefs:
121-
name = find_argumented_step_fixture_name(name, type_, fixturemanager)
122-
if name:
123-
return _find_step_fixturedef(fixturemanager, item, name, type_)
124-
else:
119+
step_fixture_name = get_step_fixture_name(name, type_)
120+
fixturedefs = fixturemanager.getfixturedefs(step_fixture_name, item.nodeid)
121+
if fixturedefs is not None:
125122
return fixturedefs
126123

124+
argumented_step_name = find_argumented_step_fixture_name(name, type_, fixturemanager)
125+
if argumented_step_name is not None:
126+
return fixturemanager.getfixturedefs(argumented_step_name, item.nodeid)
127+
return None
128+
127129

128130
def parse_feature_files(paths, **kwargs):
129131
"""Parse feature files of given paths.

tests/generation/test_generate_missing.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,61 @@ def test_missing_steps():
8585
)
8686

8787
result.stdout.fnmatch_lines(["Please place the code above to the test file(s):"])
88+
89+
90+
def test_generate_missing_with_step_parsers(testdir):
91+
"""Test that step parsers are correctly discovered and won't be part of the missing steps."""
92+
testdir.makefile(
93+
".feature",
94+
generation=textwrap.dedent(
95+
"""\
96+
Feature: Missing code generation with step parsers
97+
98+
Scenario: Step parsers are correctly discovered
99+
Given I use the string parser without parameter
100+
And I use parsers.parse with parameter 1
101+
And I use parsers.re with parameter 2
102+
And I use parsers.cfparse with parameter 3
103+
"""
104+
),
105+
)
106+
107+
testdir.makepyfile(
108+
textwrap.dedent(
109+
"""\
110+
import functools
111+
112+
from pytest_bdd import scenarios, given, parsers
113+
114+
scenarios("generation.feature")
115+
116+
@given("I use the string parser without parameter")
117+
def i_have_a_bar():
118+
return None
119+
120+
@given(parsers.parse("I use parsers.parse with parameter {param}"))
121+
def i_have_n_baz(param):
122+
return param
123+
124+
@given(parsers.re(r"^I use parsers.re with parameter (?P<param>.*?)$"))
125+
def i_have_n_baz(param):
126+
return param
127+
128+
@given(parsers.cfparse("I use parsers.cfparse with parameter {param:d}"))
129+
def i_have_n_baz(param):
130+
return param
131+
"""
132+
)
133+
)
134+
135+
result = testdir.runpytest("--generate-missing", "--feature", "generation.feature")
136+
assert_outcomes(result, passed=0, failed=0, errors=0)
137+
assert not result.stderr.str()
138+
assert result.ret == 0
139+
140+
output = result.stdout.str()
141+
142+
assert "I use the string parser" not in output
143+
assert "I use parsers.parse" not in output
144+
assert "I use parsers.re" not in output
145+
assert "I use parsers.cfparse" not in output

0 commit comments

Comments
 (0)