cucumber undefined step after refactor: how to fix
Fixes Cucumber 'undefined step' errors after refactors: step definitions and expressions. Use when steps go undefined after renaming. Not for new steps (write definitions).
TL;DR
The Gherkin step no longer matches any step definition, usually after a rename. Update the step text or the definition's expression so they match again, and use Cucumber's snippets to catch drift.
Error
Undefined step: "I click the Save button" (Cucumber::Undefined)
You can implement step definitions for undefined steps with these snippets:Steps
- Copy the undefined step text exactly. Expected: you have the literal string.
- Find the old definition: search step files for the previous wording. Expected: the renamed or deleted definition.
- Update either the feature file (if the new wording is better) or the definition's regex/expression (if the old step should still work). Expected: one source of truth.
- Run with
--strictso undefined steps fail instead of passing silently. Expected: drift is caught immediately. - Re-run the feature. Expected: green.
When to use
Undefined stepafter a refactor or rename.- Step definition files reorganized.
When not to use
- Brand-new steps (write the definition; the snippet helps).
- Parameter type mismatches (different error).
Tool compatibility
- Cucumber Ruby/JS;
--strictmode.
Variant phrasings
Cucumber step undefined after rename
The refactor trigger; update text or definition.
Undefined steps in Cucumber
The general case; snippets show the fix.
Why it happens
Steps are matched by string. Renaming either side without the other breaks the match, and refactors rename things constantly.
Edge cases
- Overly clever regexes match too much; prefer Cucumber expressions.
--strictin CI prevents silent skips.- Shared step libraries need versioning when features diverge.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_4C0qHqVjon-ZaR8l3f5SEg
Maintainer review
No maintainer verification is recorded for this version.
This records the version a maintainer checked. It does not assert that the version is the latest upstream release.