Reputation: 13195
I have read the topic Guardfile for running single cucumber feature in subdirectory?, and this works great: when I change a feature, only this will be run by guard.
But in the other direction it doesn't work: when I edit any step definition file, always all features are run, whether they are using any of the steps in the step definition file, or not.
This is not nice. I'd like to have at least only those features to be run which use any of the steps in the edited file; but even better would be if guard could see which step currently is edited, and then only runs the features that use this specific step.
The first shouldn't be that hard to accomplish, I guess; the second rather seems wishfu thinking...
Upvotes: 0
Views: 372
Reputation: 5501
To master Guard and have the perfect setup for your projects and own needs, you have to change the Guardfile
and configure your watchers accordingly. The templates that comes with each Guard plugin try to match the most useful behavior for most users, which might differ from your personal preferences.
Each Guard plugin starts with the guard
DSL method, followed by an options hash to configure the Guard plugin. The options are often different for different Guard plugins and you have to consult the plugin README for more information.
In between the guard
block do ... end
you normally configure your watchers. A watcher must be defined with a RegExp, which describe the files to be watched. I use Rubular to test my watchers and you can paste your current features copied from the output from find features
to have real files to test your RegExp.
The line
watch(%r{features/.+\.feature})
for example watches for all files in the features
folder that ends with .feature
. Since there is no block provided to the watcher, the matched file is passed unmodified to Guard::Cucumber for running.
The watcher
watch(%r{features/support/.+}) { 'features' }
matches all files in the features/support
directory and because the block always returns features
, every time a file within the support directory changes, features
is passed to Guard::Cucumber and thus all features are exectued.
The last line
watch(%r{features/step_definitions/(.+)_steps\.rb}) do |m|
Dir[File.join("**/#{m[1]}.feature")][0] || 'features'
end
watches for every file that ends with _steps.rb
in the features/step_definitions
dierctory and tries to match a feature for the step definition. Please notice the parenthesis in the RegExp features/step_definitions/(.+)_steps\.rb
. This defines a match group, that is available later in your watcher block. For example, a step definition features/step_definitions/user_steps.rb
will match and the first match group (m[1]
) will contain the value user
.
Now we try to find a matching file in all subdirectories (**
) that is named user.feature
. If this is the case then run the first matching file ([0]
) or if you do not find anything, then run all features
.
So it looks like you've named your steps different from what the default Guard::Cucucmber Guardfile is expecting, which is totally fine. Just change the watcher to match your naming convention.
Upvotes: 1