2011-06-21 39 views
2

我有我的模型validates_uniqueness_of驗證:validates_uniqueness_of與測試失敗,機械師

#SwimMeetRelayEvent.rb 
validates_uniqueness_of :event_number_digit, :scope => [:swim_meet_id, :event_number_alpha] 
validates_uniqueness_of :event_number_alpha, :scope => [:swim_meet_id, :event_number_digit] 

#blueprint.rb 
    SwimMeetRelayEvent.blueprint do 
    swim_meet   { SwimMeet.make } 
    athlete_min_age  { rand(4) + 8 } 
    athlete_max_age  { rand(4) + 12 } 
    athlete_gender  { Sham.gender } 
    distance   { ['25', '50', '100'].sort_by { rand }.first } 
    stroke    { [6, 7].sort_by {rand}.first } 
    event_number_digit { rand(100) + 1} 
    event_number_alpha { ('A'..'Z').to_a.sort_by {rand}.first} 
    end 

我使用機械師和上面的驗證失敗我運行

SwimMeetRelayEvent.make 

我測試的任何時間'我只是在我的測試中創建了'Event',並嘗試了event_number_digit,event_number_alpha的不同值,但沒有運氣。有任何想法嗎?

# trace 
    1) Error: 
test_something(Manage::SwimRelayTeamsHelperTest): 
ActiveRecord::RecordInvalid: Validation failed: Event number digit has already been taken, Event number alpha has already been taken, Event number Event Number is already take 
n 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/validations.rb:1102:in `save_with_validation!' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/dirty.rb:87:in `save_with_dirty!' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/transactions.rb:200:in `block (2 levels) in save_with_transactions!' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/transactions.rb:182:in `transaction' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/transactions.rb:200:in `block in save_with_transactions!' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/transactions.rb:208:in `rollback_active_record_state!' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/activerecord-2.3.11/lib/active_record/transactions.rb:200:in `save_with_transactions!' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/machinist-1.0.6/lib/machinist/active_record.rb:55:in `make' 
    /Users/dwalseth/.rvm/gems/[email protected]/gems/machinist_callbacks-0.2.0/lib/machinist_callbacks.rb:51:in `block (2 levels) in <top (required)>' 
    test/unit/helpers/manage/swim_relay_teams_helper_test.rb:5:in `block in <class:SwimRelayTeamsHelperTest>' 

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

Test run options: --seed 62766 
rake aborted! 
Command failed with status (1): [/Users/dwalseth/.rvm/rubies/ruby-1.9.2-p13...] 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:995:in `block in sh' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:1010:in `call' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:1010:in `sh' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:1094:in `sh' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:1029:in `ruby' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:1094:in `ruby' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake/testtask.rb:117:in `block (2 levels) in define' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:1112:in `verbose' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake/testtask.rb:102:in `block in define' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:636:in `call' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:636:in `block in execute' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:631:in `each' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:631:in `execute' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:597:in `block in invoke_with_call_chain' 
/Users/dwalseth/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2029:in `block (2 levels) in top_level' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2029:in `each' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2029:in `block in top_level' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2001:in `block in run' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:1998:in `run' 
/Users/dwalseth/.rvm/gems/[email protected]/gems/rake-0.8.7/bin/rake:31:in `<top (required)>' 
/Users/dwalseth/.rvm/gems/[email protected]/bin/rake:19:in `load' 
/Users/dwalseth/.rvm/gems/[email protected]/bin/rake:19:in `<main>' 
+0

just fyi,'validates_uniqueness_of'在最新版本的Rails中已棄用 – apneadiving

+0

已記錄,感謝@apneadiving – telecasterrok

+0

您可以發佈您的事件藍圖嗎? – rubysolo

回答

1

我會從驗證測試數據庫在測試運行之間被清除開始。您可以運行:

rake db:test:prepare 

信息(默認),將刪除並重新測試數據庫,以匹配開發數據庫模式 - 應該是在這一點上的空白。如果你在運行後測試一個新的數據庫,你還會遇到問題嗎?

它們隨機排列的關鍵是否至關重要?您可以定義依次生成它們是假的:

Sham.define do 
    event_number_digit { |index| (index % 100) + 1 } 
    event_number_alpha { |index| ('A'..'Z').to_a[index] } 
end 

然後用欺詐手法在你藍圖。這樣,你可以保證你可以在違反唯一性約束之前連續做出26個。隨機生成時,隨時可能出現隨機失敗的風險。

+0

我嘗試了你的建議,但仍然得到驗證錯誤。嗯... – telecasterrok

+0

我有與硒Rails3水豚Rspec設置完全相同的問題。任何時候uniqueness => true我收到一個錯誤,說電子郵件或用戶名或任何已經採取。無法弄清楚。 – chell