Ken Mayer
2009-Apr-23 15:19 UTC
[rspec-users] [Cucumber, Rails] Load path hell with plugins /extensions
I discovered this while debugging a RadiantCMS extension: cucumber uses ''require'' to load step definitions, _and_ since I loaded the rails environment (in features/support/env.rb) for testing, _and_ radiant necessarily adds extensions to the load path, the path to _every_ extension in your project is added to $LOAD_PATH ($:) -- and, it is a sorted list (items are not queued). Imagine the fun when you try to load ''features/support/paths.rb'' only to discover (after single stepping through a lot of code) that it required an identically named file, but from a completely different project. DLL hell. e.g. Given this tree, trying to run ''rake spec:features'' in .../ data_manager pulls in files from .../citations first because it is lexically before it. RAILS_ROOT |-- config | `-- environments `-- vendor |-- extensions | |-- citations | | |-- Rakefile | | |-- features | |-- data_manager | | |-- Rakefile | | |-- features `-- radiant |-- features | |-- admin | |-- step_definitions | `-- support I''m not sure what the solution is, but for now, if you modify your extension Rakefile to include the following (prepend the patterns with the current directory): ... Cucumber::Rake::Task.new(:features) do |t| # t.cucumber_opts = "..." t.step_pattern = File.dirname(__FILE__) + "/features/**/*.rb" t.feature_pattern = File.dirname(__FILE__) + "/features/**/ *.feature" end Please note: I''m getting deprecation warnings, in 3.0, about using these accessors, but the command line options are not yet available. Aloha a hui hou, Ken -- Ken Mayer / kmayer at bitwrangler.com / 808-722-6142 / http://www.bitwrangler.com/