2013-07-24 120 views
0

我有一個奇怪的錯誤。當我試圖運行單元測試,它給了我下面的錯誤:rake test - self.table_name not recognized

test_the_truth(UpdateMainTest): 
ActiveRecord::StatementInvalid: Could not find table 'blacklists' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:472:in `table_structure' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb:346:in `columns' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:660:in `column_names' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:652:in `timestamp_column_names' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:585:in `block in table_rows' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:579:in `each' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:579:in `map' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:579:in `table_rows' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:494:in `block (3 levels) in create_fixtures' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:492:in `each' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:492:in `block (2 levels) in create_fixtures' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:491:in `block in create_fixtures' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_adapter.rb:168:in `disable_referential_integrity' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:476:in `create_fixtures' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:895:in `load_fixtures' 
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/fixtures.rb:849:in `setup_fixtures' 
/var/lib/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:407:in `_run__379848442555604621__setup__3487204981098397389__callbacks' 
/var/lib/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:405:in `__run_callback' 
/var/lib/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:385:in `_run_setup_callbacks' 
/var/lib/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:81:in `run_callbacks' 
/var/lib/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/testing/setup_and_teardown.rb:35:in `run' 

這是我的黑名單模式:

class Blacklist < ActiveRecord::Base 
    attr_accessible :abbreviation, :name 
    self.table_name = "blacklist" 
    validates :abbreviation, :presence => :true, :uniqueness => :true 
    validates :name, :presence => :true 
end 

該模式還正確地列出表:

create_table "blacklist", :force => true do |t| 
    t.string "name" 
    t.string "abbreviation" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

我跑耙db:測試:不止一次準備,但錯誤仍然存​​在。 當我使用rails控制檯時,我可以創建沒有錯誤的黑名單對象。 任何想法我可以做什麼?

回答

0

謝謝你的所有幫助。

我無法真正追查問題的根源,但是當我在test_helper.rb中註釋掉加載所有燈具的行時,錯誤再次出現。

0

使用與以複數的形式符號,表名應該是複數:

create_table "blacklists", :force => true do |t| 
    t.string "name" 
    t.string "abbreviation" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 
+0

感謝您的回答,但我特別指定了self.table_name,不必使用名稱「黑名單」。如果有一個以非標準方式命名錶的函數,它不應該能夠正常工作嗎? – RoRNewbie

+0

使用self.class.table_name。它可能工作。並在attr_accessible之上使用它。 –

+0

試了兩個。 self.class.table_name給出的錯誤是,方法table_name在Class:Class中不可用,並且在attr_accessible之前也不會進行更改。 – RoRNewbie

0

如果只與你的單元測試的發生,也許是測試:

self.table_name = :blacklists 

用複數形式創建的表名db已過時。你應該嘗試重建它rake db:migrate db:test:clone

+0

謝謝,它沒有工作。 – RoRNewbie