2011-06-27 12 views
4

をテストしGemfileShouldaスーパーミスマッチがshouldaを使用した単純なユニットテストを記述しようと

の3

テスト/ユニット/ 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 

要部レール

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クラスがどこに定義されているのか分かりません。何かご意見は?

マイク

+0

'find。 | xargs grep -l UserTest' return?プロジェクトのルートから実行します。 –

+0

うわー私はばかだよ - このユニットテストのコードを別のユニットテストにコピーしたので、UserTestを2回定義することになった。どうもありがとう! –

+0

私はそれが比較的頻繁な間違いだと思う;) –

答えて

5

は、クラス名を誤って重複した用途に対してfind . | xargs grep -l UserTestの出力を確認してください。

+0

ありがとうございましたs - そのトリックでした! :) –

+1

'--name '* .rb''を' find'に追加したいかもしれません。 –

0

私はこの間違いを避ける想像できる唯一の方法は、以下の手順を実行している:

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 

を得るだろう。しかしこのアプローチは少し奇妙に見えるだろう。

+0

ええ - それはうまくいくでしょうが、それはもっと微妙な問題、つまり愚かなプログラミングです。私はそれについての修正に取り組んでいますが、まだそれを得ていません。 :) –

+0

@Mike:作成時にパッチを送ってください! :) –

関連する問題