【问题标题】:uninitialized constant Test::Unit::TestResult::TestResultFailureSupport未初始化的常量 Test::Unit::TestResult::TestResultFailureSupport
【发布时间】:2009-10-05 13:12:59
【问题描述】:

当我尝试在新的 Rails 项目中运行规范或生成器时,我在 subj 中遇到错误。

当我将 shoulda 添加到组合中时会发生这种情况。

我在 config/environment.rb 中添加了以下内容:

config.gem 'rspec', :version => '1.2.6', :lib => false
config.gem 'rspec-rails', :version => '1.2.6', :lib => false
config.gem "thoughtbot-shoulda", :version => "2.10.2", :lib => 'shoulda', :source => "http://gems.github.com"

我在 OSX 上。

  • ruby 1.8.6(2008-08-11 补丁级别 287)
  • 宝石 1.3.5
  • 导轨 2.3.4
  • rspec - 1.2.6
  • 应该 - 2.10.2
  • 测试单元 - 2.0.3

我知道this 并添加config.gem 'test-unit', :lib => 'test/unit' 确实解决了生成器问题,因为它不会引发异常,但它会在运行结束时打印0 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications,所以我想它会尝试运行测试这是出乎意料和不受欢迎的,规格也完全停止运行,似乎 rspec 根本没有运行,当运行rake spec 时,我再次得到测试单元输出(由于只有规格,所以没有测试定义为 0 个测试)

【问题讨论】:

  • 删除测试单元 gem 确实有帮助,但我不能称之为解决方案:(

标签: ruby-on-rails unit-testing testing rspec shoulda


【解决方案1】:

我最近遇到了类似的问题,并在 ruby​​gems 中追踪到了这个提交:

http://github.com/vvs/rubygems/commit/cbb4b07d491dd49b8dff8ab7af706dde31307c7d

如果存在则加载“测试单元”gem,如果不存在则静默继续。这种改变的作者可能没有意识到一个基本的事实——激活一个 gem 通常可以改变加载到系统中的其他 gem 的行为。应用程序开发人员应该负责定义他们想要激活的一组 gem; rubygems 系统本身决定选择性地加载 gem 是一个令人头疼的问题。

这个问题的另一半是为什么 test-unit gem 会干扰 rspec。我无法回答这个问题,但我确实将其追溯到没有注册 ExampleGroups 的事实,这反过来是因为当 Rspec 动态创建 ActiveSupport 的新子类时没有调用 ExampleGroupMethods 中的“继承”回调: :TestCase(发生在 ExampleGroupMethods#subclass 中)

【讨论】:

  • 所以想一想,不清楚我说的是同一个问题还是不同的问题。我正在谈论的问题仅在我使用 geminstaller 时发生,它需要 ruby​​gems 的一部分('rubygems/validator'),然后尝试要求测试单元,但如果 gem 不可用,则静默继续。听起来您好像没有使用 geminstaller,所以我不清楚是 ruby​​gems 正在拉入测试单元。
  • 也不确定,我不再遇到这个问题,但无论如何都会奖励你的努力:) 我没有耐心去追踪这一切。
  • 我认为这是相关的......当我卸载测试单元时,这个问题就消失了。我没有使用 geminstaller。问题是我想运行一个 ci 服务器,其中一些项目使用 test-unit 而其他项目使用 rspec,所以这特别令人沮丧:(
【解决方案2】:

根据我找到的here 的对话,似乎问题不在于 RSpec 在所有版本的测试单元中都死了,而只是它与较新的版本不兼容。因此,完全卸载 test-unit 是一种解决方法。但是,如果这不适合您(因为它不适合我),您可以安装旧版本(例如 1.2.3),并确保在 rspec 之前加载它。

例如,我的 environment/test.rb 文件中有这个,并且测试再次运行:

config.gem 'test-unit'  , :lib => 'test/unit',  :version => '<2.0'
config.gem "rspec",       :lib => false, :version => '<2.0'
config.gem "rspec-rails", :lib => false, :version => '<2.0'

【讨论】:

    【解决方案3】:

    test-unit 实际上是内置在 Ruby 中的,因此删除 gem 会退回到 Ruby 的内置版本。除非您需要一些特殊的东西,而这些东西没有包含在默认测试单元中,否则我不会太担心这一点。

    【讨论】:

    • 是的,但如果只是安装了测试单元(它是对某些东西的依赖),那么就会在某个地方出现问题。现在我刚刚删除了 test-unit gem,但我可能不得不再次将它带回来。
    • 确实如此。我以前遇到过同样的问题,希望其他人能对此有所了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多