【问题标题】:Shoulda superclass mismatch on unit tests单元测试中的超类是否应该不匹配
【发布时间】:2011-06-27 18:28:40
【问题描述】:

尝试使用 shoulda 和 rails 3 编写一个简单的单元测试。

test/unit/user_test.rb

class UserTest < Test::Unit::TestCase
  should validate_presence_of(:password, :on => :create)
  should validate_presence_of(:handle, :email)
  should validate_confirmation_of(:password)
  should validate_length_of(:handle, :within => 6..15)
  should validate_uniqueness_of(:handle)
  should validate_format_of(:handle, :with => /\A\w+\z/i)
  should validate_length_of(:email, :within => 6..100)
end

Gemfile

的相关部分
group :test do
  gem 'shoulda'
  gem 'rspec-rails', '2.0.0.beta.12'
end

当我尝试使用 rake test --trace 运行它时,我收到以下错误:

** Execute test:units
/Users/removed/removed/removed/app_name/test/unit/user_test.rb:5: superclass mismatch for class UserTest (TypeError)
    from /Library/Ruby/Gems/1.8/gems/activesupport-3.0.7/lib/active_support/dependencies.rb:239:in `require'
    from /Library/Ruby/Gems/1.8/gems/activesupport-3.0.7/lib/active_support/dependencies.rb:239:in `require'
    from /Library/Ruby/Gems/1.8/gems/activesupport-3.0.7/lib/active_support/dependencies.rb:227:in `load_dependency'
    from /Library/Ruby/Gems/1.8/gems/activesupport-3.0.7/lib/active_support/dependencies.rb:239:in `require'
    from /Library/Ruby/Gems/1.8/gems/rake-0.9.2/lib/rake/rake_test_loader.rb:9
    from /Library/Ruby/Gems/1.8/gems/rake-0.9.2/lib/rake/rake_test_loader.rb:9:in `each'
    from /Library/Ruby/Gems/1.8/gems/rake-0.9.2/lib/rake/rake_test_loader.rb:9
    from /Library/Ruby/Gems/1.8/gems/rake-0.9.2/lib/rake/rake_test_loader.rb:5:in `each'
    from /Library/Ruby/Gems/1.8/gems/rake-0.9.2/lib/rake/rake_test_loader.rb:5

我理解错误,我只是不知道在哪里定义另一个 UserTest 类,这给了我这个问题。有什么想法吗?

迈克

【问题讨论】:

  • find . | xargs grep -l UserTest 返回什么?从项目的根目录运行它。
  • 哇,我是个白痴——原来我已经将这个单元测试中的代码复制到另一个单元测试中,因此定义了 UserTest 两次。非常感谢!
  • 我猜这是一个比较常见的错误;)

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


【解决方案1】:

检查find . | xargs grep -l UserTest 的输出,防止意外重复使用类名。

【讨论】:

  • 您可能希望将-name '*.rb' 添加到您的find
【解决方案2】:

我想避免这个错误的唯一方法是执行以下操作:

UserTest = Class.new(Test::Unit::TestCase)
class UserTest # Or class UserTest < Test::Unit::TestCase is also allowed
  should validate_presence_of(:password, :on => :create)
  should validate_presence_of(:handle, :email)
  should validate_confirmation_of(:password)
  should validate_length_of(:handle, :within => 6..15)
  should validate_uniqueness_of(:handle)
  should validate_format_of(:handle, :with => /\A\w+\z/i)
  should validate_length_of(:email, :within => 6..100)
end

如果你要重复

UserTest = Class.new(Test::Unit::TestCase) # repeated

你会得到

warning: already initialized constant UserTest

但是这种方法看起来有点奇怪。

【讨论】:

  • 是的——它会起作用,但对于一个更微妙的问题来说它是矫枉过正的:愚蠢的编程。我正在努力解决这个问题,但还没有做好。 :)
  • @Mike:当你创建补丁时把它发给我! :)
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2016-06-08
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多