My Rails app passes its test but then says 0% passed. Its a Rails 3 app converted to 3.1.
5 tests, 11 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
0% passed
If I generate a new Rails 3.1 app it doesnt have this "passed" line.
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
Both are running under 1.9.2 p290.
I tried removing test-unit but that did not seem to make a difference and nothing else stands out to me that would cause it. I guess something is triggering the use of a different test runner.
These are the gems installed for my app:
actionmailer (3.1.1)
actionpack (3.1.1)
activemodel (3.1.1)
activerecord (3.1.1)
activeresource (3.1.1)
activesupport (3.1.1)
ansi (1.3.0)
archive-tar-minitar (0.5.2)
arel (2.2.1)
bcrypt-ruby (3.0.1)
bootstrap-sass (1.3.0)
builder (3.0.0)
bundler (1.0.21)
coderay (0.9.8)
coffee-rails (3.1.1)
coffee-script (2.2.0)
coffee-script-source (1.1.2)
columnize (0.3.4)
devise (1.4.7)
devise_rpx_connectable (0.2.2)
enumerated_attribute (0.2.16)
erubis (2.7.0)
execjs (1.2.9)
haml (3.1.3)
hike (1.2.1)
i18n (0.6.0)
jquery-rails (1.0.14)
json (1.6.1)
json_pure (1.6.1)
linecache19 (0.5.12)
mail (2.3.0)
meta_programming (0.2.2)
method_source (0.6.6)
mime-types (1.16)
multi_json (1.0.3)
orm_adapter (0.0.5)
polyglot (0.3.2)
pry (0.9.6.2)
pry-doc (0.3.0)
rack (1.3.4)
rack-cache (1.1)
rack-mount (0.8.3)
rack-ssl (1.3.2)
rack-test (0.6.1)
rack-webconsole (0.1.2)
rails (3.1.1)
railties (3.1.1)
rake (0.9.2)
rdoc (3.10)
rpx_now (0.6.24)
ruby-debug-base19 (0.11.25)
ruby-debug19 (0.11.6)
ruby_core_source (0.1.5)
ruby_parser (2.0.6)
sass (3.1.10)
sass-rails (3.1.4)
sexp_processor (3.0.7)
slop (2.1.0)
sprockets (2.0.2)
sqlite3 (1.3.4)
test-unit (2.4.0)
thor (0.14.6)
tilt (1.3.3)
treetop (1.4.10)
turn (0.8.2)
tzinfo (0.3.30)
uglifier (1.0.3)
warden (1.0.6)
yard (0.7.2)
And this is what I get with the default rails new'd app
actionmailer (3.1.1)
actionpack (3.1.1)
activemodel (3.1.1)
activerecord (3.1.1)
activeresource (3.1.1)
activesupport (3.1.1)
ansi (1.3.0)
arel (2.2.1)
builder (3.0.0)
bundler (1.0.21)
coffee-rails (3.1.1)
coffee-script (2.2.0)
coffee-script-source (1.1.2)
erubis (2.7.0)
execjs (1.2.9)
hike (1.2.1)
i18n (0.6.0)
jquery-rails (1.0.14)
json (1.6.1)
mail (2.3.0)
mime-types (1.16)
multi_json (1.0.3)
polyglot (0.3.2)
rack (1.3.4)
rack-cache (1.1)
rack-mount (0.8.3)
rack-ssl (1.3.2)
rack-test (0.6.1)
rails (3.1.1)
railties (3.1.1)
rake (0.9.2)
rdoc (3.10)
sass (3.1.10)
sass-rails (3.1.4)
sprockets (2.0.2)
sqlite3 (1.3.4)
test-unit (2.4.0)
thor (0.14.6)
tilt (1.3.3)
treetop (1.4.10)
turn (0.8.2)
tzinfo (0.3.30)
uglifier (1.0.3)
EDIT
I have cut out everything from the app and pushed it to github - https://github.com/kimptoc/zero-percent-bugette When I just run "rake", I still get 0% passed:
$ rake
Loaded suite /Users/kimptoc/.rvm/gems/ruby-1.9.2-p290@p-viadropbox31/gems/rake-0.9.2.2/lib/rake/rake_test_loader
Started
Finished in 0.000897 seconds.
1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
0% passed
1114.83 tests/s, 1114.83 assertions/s
Coverage report generated for /Users/kimptoc/.rvm/gems/ruby-1.9.2-p290@p-viadropbox31/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb to /Users/kimptoc/dev/ruby/fran/zero-percent/coverage. 4 / 4 LOC (100.0%) covered.
If you are using test-unit
with Rails, then you cannot do anything. I believe it is a bug in activesupport
gem that comes with Rails. In more detail:
Normally, test-unit
has a method add_pass
that increases the count of tests that pass. This is called inside run(...)
method (testcase.rb
file). However, activesupport
hides/overrides this method with its own implementation. It is method run(...)
inside file setup_and_teardown.rb
(The full name of method is ActiveSupport::Testing::SetupAndTeardown::ForClassicTestUnit#run()
.
I have modified this method as follows:
def run(result)
return if @method_name.to_s == "default_test"
mocha_counter = retrieve_mocha_counter(result)
yield(Test::Unit::TestCase::STARTED, name)
@_result = result
begin
begin
_run_setup_callbacks do
setup
__send__(@method_name)
mocha_verify(mocha_counter) if mocha_counter
end
result.add_pass # XXXXXXXXXXXX My Addition to count passed tests XXXXXXXXXX
rescue Mocha::ExpectationError => e
add_failure(e.message, e.backtrace)
rescue Test::Unit::AssertionFailedError => e
add_failure(e.message, e.backtrace)
rescue Exception => e
raise if PASSTHROUGH_EXCEPTIONS.include?(e.class)
add_error(e)
ensure
begin
teardown
_run_teardown_callbacks
rescue Test::Unit::AssertionFailedError => e
add_failure(e.message, e.backtrace)
rescue Exception => e
raise if PASSTHROUGH_EXCEPTIONS.include?(e.class)
add_error(e)
end
end
ensure
mocha_teardown if mocha_counter
end
result.add_run
yield(Test::Unit::TestCase::FINISHED, name)
end
I have added result.add_pass
which was not there, and now percentages should be ok.
UPDATE: To help you out integrating this change and test/see for yourself, you can clone a gist that I have created using the following command:
git clone git://gist.github.com/1324512.git gist-1324512
This will create a file with name : active_support_test_unit_pass_count.rb
Move that to your test
folder where test_helper.rb
file is and require it in your test_helper.rb
file, exactly before the definition of the ActiveSupport::TestCase
class:
require 'active_support_test_unit_pass_count'
class ActiveSupport::TestCase
....
Then run your tests and see the percentage result. To me...it worked ok.
I ran across this on an old Rails 3.2.22 app. I found an easier solution than above (above gave me other errors as it makes assumptions about versions etc).
I added test-unit-rails
gem to my gemfile, for me I had to lock it to version 1.0.4
as it supported the version of test-unit I was previously using.
In my test_helper.rb
file I added:
require "test/unit/active_support"
require 'active_support'
Here's the docs I found it from. Specifically, it's an active-support plugin for test-unit.
Try removing test unit and installing mini-test. In your Gemfile:
gem "minitest"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With