Rails: How to test code in the lib/ directory? Rails: How to test code in the lib/ directory? ruby-on-rails ruby-on-rails

Rails: How to test code in the lib/ directory?


In the Rails application I'm working on, I decided to just place the tests in the test\unit directory. I will also nest them by module/directory as well, for example:

lib/a.rb   => test/unit/a_test.rblib/b/c.rb => test/unit/b/c_test.rb

For me, this was the path of last resistance, as these tests ran without having to make any other changes.


Here's one way:

Create lib/tasks/test_lib_dir.rake with the following

namespace :test do  desc "Test lib source"  Rake::TestTask.new(:lib) do |t|        t.libs << "test"    t.pattern = 'test/lib/**/*_test.rb'    t.verbose = true      endend

Mimic the structure of your lib dir under the test dir, replacing lib code with corresponding tests.

Run rake test:lib to run your lib tests.

If you want all tests to run when you invoke rake test, you could add the following to your new rake file.

lib_task = Rake::Task["test:lib"]test_task = Rake::Task[:test]test_task.enhance { lib_task.invoke }


I was looking to do the same thing but with rspec & autospec and it took a little digging to figure out just where they were getting the list of directories / file patterns that dictated which test files to run. Ultimately I found this in lib/tasks/rspec.rake:86

  [:models, :controllers, :views, :helpers, :lib, :integration].each do |sub|    desc "Run the code examples in spec/#{sub}"    Spec::Rake::SpecTask.new(sub => spec_prereq) do |t|      t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]      t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]    end  end

I had placed my tests in a new spec/libs directory when the rpsec.rake file was configured to look in spec/lib. Simply renaming libs -> lib did the trick!