I’m working on writing simple unit tests for a Rails 3 project, but I’m unable to actually execute any tests.
Case in point, attempting to run the test auto-generated by Rails fails:
require 'test_helper'
class UserTest < ActiveSupport::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end
Results in the following error:
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
test_helper (LoadError)
from <internal:lib/rubygems/custom_require>:29:in `require'
from user_test.rb:1:in `<main>'
Commenting out the require ‘test_helper’ line and attempting to run the test results in this error:
user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)
The action pack gems appear to be properly installed and up to date:
actionmailer (3.0.3, 2.3.5)
actionpack (3.0.3, 2.3.5)
activemodel (3.0.3)
activerecord (3.0.3, 2.3.5)
activeresource (3.0.3, 2.3.5)
activesupport (3.0.3, 2.3.5)
Ruby is at 1.9.2p0 and Rails is at 3.0.3.
The sample dump of my test directory is as follows:
/fixtures
/functional
/integration
/performance
/unit
-- /helpers
-- user_helper_test.rb
-- user_test.rb
test_helper.rb
I’ve never seen this problem before – I’ve run the typical rake tasks for preparing the test environment. I have nothing out of the ordinary in my application or environment configuration files, nor have I installed any unusual gems that would interfere with the test environment.
Edit March 9th
Xavier Holt‘s suggestion, explicitly specifying the path to the test_helper worked; however, this revealed an issue with ActiveSupport.
Now when I attempt to run the test, I receive the following error message (as also listed above):
user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)
But as you can see above, Action Pack is all installed and update to date.
Edit March 13th
When attempting to run tests using rake test:units the following stack trace is dumped to the console:
test/unit/bookmark_test.rb:3:in `<top (required)>': uninitialized constant Objec
t::ActiveSupport (NameError)
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `load'
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `block in <main>'
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `each'
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `<main>'
rake aborted!
So looking into the file listed above, I see the following:
#!/usr/bin/env ruby
# Load the test files from the command line.
ARGV.each { |f| load f unless f =~ /^-/ }
To my knowledge, everything looks as expected.
Your
test/test_helperfile should have been created when you generated the application. It contains this valuable content:The second line here is the most important: it requires the
config/environment.rbfile at the root of your application, which in turn requires a lot of other things, including the valuable (I like that word today, ok?)ActiveSupportconstant.When you generate a controller, model or scaffold it’ll also generate tests for those. I just ran
rails g scaffold ticketin my app and it generatedtest/unit/ticket_test.rbwhich contains this:The first line of this file will require the
test/test_helper.rbfile that we jut saw. This will loadActiveSupportand theTestCaseclass within it, thereby making this test feasible. Everything else just flows on from there.With all that explanation out of the way (even though it’s something that you already know), I’m placing a large wager on it’s something that’s masscaring your
LOAD_PATH, causing thetestdirectory to be removed from it.What’s really unusual is that when you do specify the full path to the
test/test_helper.rbyou’re saying it loads it, butActiveSupportis still undefined. Well, that should be loaded as-per the description above. Is it actually loadingconfig/environment.rb? Can you put something such as:At the top of your
config/environment.rbfile and then run the tests again? It should be output. Very unusual.Continuing on the thread aboutLOAD_PATH… Got a dirty little secret you’re not telling us about?Actually, Dan Cheail makes a good point. You could be running the tests using
ruby test/unit/ticket_test.rbin which casetest_helperwouldn’t be available, but still that still doesn’t explain why when you specify the full path you’re still getting an undefined constantActiveSupport.If you want to run a single test you should be doing this:
That
-Ioption there adds thetestdirectory to the load path, meaning thetest_helperfile will be available through a straightrequire 'test_helper'. If it still errors after this, I reckon yourtest/test_helper.rbis either empty or broken.