【问题标题】:Rails tests showing 0% passed when all pass当全部通过时,Rails 测试显示 0% 通过
【发布时间】:2011-10-09 20:54:00
【问题描述】:

我的 Rails 应用程序通过了测试,但随后显示 0% 已通过。它是一个转换为 3.1 的 Rails 3 应用程序。

5 tests, 11 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
0% passed

如果我生成一个新的 Rails 3.1 应用程序,它没有这个“通过”行。

1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

两者都在 1.9.2 p290 下运行。

我尝试删除 test-unit ,但这似乎没有任何影响,而且对我来说没有其他任何事情会导致它。我猜是什么东西触发了使用不同的测试运行器。

这些是为我的应用安装的 gem:

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)

这就是我使用默认的 rails new'd 应用程序得到的结果

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)

编辑

我已经从应用程序中删除了所有内容并将其推送到 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.

【问题讨论】:

  • 你有什么完整的项目可以看一下吗?
  • 嗨夹竹桃 - 让我看看我能敲出什么
  • 完成后推送到 Github。

标签: ruby ruby-on-rails-3 ruby-on-rails-3.1


【解决方案1】:

如果您在 Rails 中使用test-unit,那么您将无能为力。我相信这是 Rails 附带的activesupport gem 中的一个错误。更详细:

通常,test-unit 有一个方法 add_pass 可以增加通过测试的数量。这在 run(...) 方法(testcase.rb 文件)中调用。然而,activesupport 用它自己的实现隐藏/覆盖了这个方法。就是文件setup_and_teardown.rb里面的方法run(...)(方法全称是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

我已经添加了result.add_pass,它不存在,现在百分比应该没问题。

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

git clone git://gist.github.com/1324512.git gist-1324512

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

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

require 'active_support_test_unit_pass_count'

class ActiveSupport::TestCase

....

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

【讨论】:

  • 谢谢 - 听起来不错,虽然它似乎没有帮助......尝试一些调整,看看我是否可以让它继续,但没有快乐 - github.com/kimptoc/zero-percent-bugette
  • @ChrisKimpton 我的朋友,我应该确切地说 在定义 ActiveSupport::TestCase 类之前。将require 'active_support_test_unit_pass_count' 正好行移到前面。我克隆了你的存储库。我看到它不起作用(如你所说),然后将行恰好移到类定义之前,这一次它运行成功。自己试试,你会看到的。 (我还编辑了我的答案以反映这一点)
  • 做到了 - 谢谢。看起来像 Rails/activesupport bugette - 将在 Rails 问题列表中提出。
  • FWIW - 哦 - 它似乎已经提出 - github.com/rails/rails/pull/2472
  • 谢谢!此外,如果您在包含文件时遇到问题,请使用以下行:require File.expand_path('../../test/active_support_test_unit_pass_count', FILE)
【解决方案2】:

我在一个旧的 Rails 3.2.22 应用程序上遇到了这个问题。我找到了一个比上面更简单的解决方案(上面给了我其他错误,因为它对版本等进行了假设)。 我将test-unit-rails gem 添加到我的gemfile 中,对我来说,我必须将其锁定到版本1.0.4,因为它支持我之前使用的测试单元版本。

在我的test_helper.rb 文件中我添加了:

require "test/unit/active_support"
require 'active_support'

Here's 我从中找到它的文档。具体来说,它是一个测试单元的主动支持插件。

【讨论】:

    【解决方案3】:

    尝试删除测试单元并安装迷你测试。在您的 Gemfile 中:

    gem "minitest"
    

    【讨论】:

    • 谢谢 - 但没有区别,仍然说 0% 通过了,但都是绿色的。我以为 minitest 是在 1.9 中,但我想还有更多...
    • 你试过没有 ruby​​-debug19 在你的 gemfile 中吗?在这一点上,只是在黑暗中刺伤。
    • LOL - 这里也一样,只是尝试卸载它 - 没有更好:( .
    • minitest 为我解决了这个问题,但只有在我删除了 test-unit 之后。
    • 对我来说,问题是我使用的是guard-test而不是guard-minitest。防护测试 gem 依赖于旧的测试单元。按照这些思路,您可能只想检查您的 Gemfile.lock 以查看 Bundler 是否因为您的一个 gem 而需要不同版本的测试/单元。另一种测试 gem 依赖项的方法是运行这个:ruby -rbundler/setup -rtest/unit -e "puts ::Test::Unit::TEST_UNIT_IMPLEMENTATION"。如果它显示uninitialized constant Test::Unit::TEST_UNIT_IMPLEMENTATION (NameError),那么你没有使用 minitest。
    【解决方案4】:

    我认为 Time 类可能有问题。

    【讨论】:

      猜你喜欢
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2020-02-25
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      相关资源
      最近更新 更多