2011-08-11 48 views

回答

24

最有可能發生這種情況是因爲一個自定義的表名被用於模型(使用set_table_name)或模型是一個模塊中。

來解決,你需要之前添加在test_helper.rb中一個set_fixture_class線「燈具:全」行:

class ActiveSupport::TestCase 

    self.use_transactional_fixtures = true 
    . 
    . 
    . 
    set_fixture_class :my_table_name => "MyModule::MyClass" 

    fixtures :all 

end 

在這種情況下,夾具文件應該被稱爲my_table_name.yml

+9

如果你的類不在模塊中(你的回答不是100%清晰),這可能是由於一個怪異的模型名稱,Rails的inflector不知道如何正確單數化。在這種情況下,您最好在config/initializers/inflections.rb中添加自定義變形,因爲它可能會在其他區域導致問題。 – hermannloose

+2

我在添加這行後面臨同樣的錯誤我的錯誤更改爲ArgumentError:ArgumentError:字符串與類的比較失敗 – wasipeer

+2

@wasipeer:嘗試'set_fixture_class my_table_name:MyModule :: MyClass' –

1

注意:如果包含堆棧跟蹤和完整的錯誤消息,這將會很有幫助。

在您的測試/ test_helper.rb中類中,有像

fixtures :all 

這告訴框架看目錄中的測試/夾具和嘗試加載每個YAML的文件,它認爲有一條線然後將它們保存到數據庫。所以我的直覺是,你有一個文件在那裏沒有類應用程序/模型與單一化名稱。換句話說,如果有一個文件test/fixtures/posts.yml,那麼當你運行你的測試時,框架會尋找一個名爲Post的類來加載你的數據。

所以我會做的第一件事檢查是否有與您的某個模型類沒有關聯的夾具文件(可能是您刪除了模型但忘記刪除了夾具?)

如果這樣不起作用,請嘗試更改該行你的測試助手可以明確地加載你需要的燈具。所以,如果你只是想加載燈具名爲郵政對象和命名對象的用戶,你會改變:

fixtures :all 

fixtures :posts, :users 
在test_helper.rb中

,你應該看到錯誤消失(雖然其他錯誤,現在可能出現,因爲您的燈具沒有loaded.0

+0

感謝您的答案羅伯。我實際上找到了解決方案,並將其添加爲答案。 –

+0

請注意,如果您在許多單元測試文件中都有「fixtures:all」,則必須將set_fixture_class放入每個文件中,而不僅僅是在要使用該模型中的fixtures的地方。這讓我很困惑,但是咖啡後它確實有意義。我寧願不知道這個信息是幹什麼的模型本身。 – mcr

0

我當我生成一些腳手架代碼時出現這個錯誤。我用了一個複數模型的名字,這只是混淆了夾具加載,我想。用單一模型名稱重新生成腳手架解決了問題。

0

在這類是在命名如fishsms 它可能已被使用--force-plural標誌 我創建方面的不規則類事件。È rails g model sms --force-plural

在你會設置其下 config/initializers/inflections.rb

的這樣的示例中設置了拐點這種情況下,是這樣的

ActiveSupport::Inflector.inflections(:en) do |inflect| 
    inflect.plural /^(ox)$/i, '\1en' 
    inflect.singular /^(ox)en/i, '\1' 
    inflect.irregular 'person', 'people' 
    inflect.uncountable %w(fish sheep) 
end 

以這種方式,類可以被識別爲你宣佈它