Rails测试显示0%通过时全部通过

Chr*_*ton 8 ruby ruby-on-rails-3 ruby-on-rails-3.1

我的Rails应用程序通过了测试,但随后说0%通过了.它的Rails 3应用程序转换为3.1.

5 tests, 11 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
0% passed
Run Code Online (Sandbox Code Playgroud)

如果我生成一个新的Rails 3.1应用程序,它没有这个"通过"线.

1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
Run Code Online (Sandbox Code Playgroud)

两者都在1.9.2 p290下运行.

我试图删除测试单元,但这似乎没有什么区别,没有其他任何突出的东西会导致它.我想有些东西正在触发使用不同的测试运行器.

这些是我的应用程序安装的宝石:

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)
Run Code Online (Sandbox Code Playgroud)

这就是我使用默认的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)
Run Code Online (Sandbox Code Playgroud)

编辑

我已经删除了应用程序中的所有内容并将其推送到github - https://github.com/kimptoc/zero-percent-bugette 当我运行"rake"时,我仍然得到0%的通过:

$ 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.
Run Code Online (Sandbox Code Playgroud)

p.m*_*los 10

如果你使用test-unitRails,那么你什么都做不了.我相信它是activesupportRails附带的gem中的一个bug .更详细:

通常,test-unit有一种方法add_pass可以增加通过的测试次数.这称为内部run(...)方法(testcase.rb文件).但是,activesupport使用自己的实现隐藏/覆盖此方法.它是run(...)文件内setup_and_teardown.rb的方法(方法的全名是ActiveSupport::Testing::SetupAndTeardown::ForClassicTestUnit#run().

我修改了这个方法如下:

    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
Run Code Online (Sandbox Code Playgroud)

我添加了result.add_pass哪些不存在,现在百分比应该没问题.

更新:为了帮助您集成此更改并自行测试/查看,您可以使用以下命令克隆我创建的要点:

git clone git://gist.github.com/1324512.git gist-1324512
Run Code Online (Sandbox Code Playgroud)

这将创建一个名称为的文件: active_support_test_unit_pass_count.rb

将其移动到test文件所在的test_helper.rb文件夹中,并在文件中要求它test_helper.rb,恰好在ActiveSupport::TestCase类的定义之前:

require 'active_support_test_unit_pass_count'

class ActiveSupport::TestCase

....
Run Code Online (Sandbox Code Playgroud)

然后运行测试并查看百分比结果.对我来说......它运作正常.

  • @ChrisKimpton我的朋友,我应该在__ ActiveSupport :: TestCase`类的定义之前完全**.准确地移动"require"active_support_test_unit_pass_count'`**行.我克隆了您的存储库.我看到它不起作用(正如你所说),然后在类的定义之前准确地移动了行,并且这次成功运行了.试试你自己,你会看到.(我也编辑了我的答案来反映这个) (2认同)