2011-12-13 78 views
8

我經常發現我希望能夠使用Rails控制檯中的測試夾具查找器(例如users(:david))。有沒有一個特定的Rails模塊可以在控制檯提示符下載入,或者我可以安裝一個寶石,這會使它們可用?在Rails控制檯內使用夾具查找器助手

我對谷歌甲骨文的疑問並沒有改變什麼,所以我不屏住呼吸,但我希望這裏有人知道一個祕密,並願意分享。

+0

讓我知道如果你想要一些factory_girl指針。我相信它足夠強大,可以管理你目前在你的燈具中處理的任何複雜性。 –

回答

7

自己弄明白了。 這適用於IRB和Pry只需將以下行添加到我的.irbrc(和/或.pryrc)文件。現在

require 'active_record/fixtures' 

def method_missing(method_name, *args, &block) 
    if fixture_names.include?(method_name) 
    method_name.to_s.singularize.titleize.constantize.find(fixture_id(args[0])) 
    else 
    super 
    end 
end 

def fixture_id(label) 
    ActiveRecord::FixtureSet.identify(label) 
end 

def fixture_names 
    Dir["#{Rails.root}/test/fixtures/*.yml"].map { |filename| filename.match(/\/([^\/]+)\.yml/)[1].to_sym } 
end 

,假設有一個test/fixtures/users.yml文件,它包含一個從Rails的控制檯命名爲diane:,然後users(:diane)夾具成功返回該用戶。

m_x的answer到原始問題有助於達到這一點。

+0

不幸的是,這段代碼不能被粘貼到控制檯中。要解決這個問題,首先粘貼fixture_names和fixture_id方法(所以method_missing不會遞歸到無窮大),然後粘貼其餘部分。 – bronson

+0

對fixture_names進行小改動將允許基於rspec的燈具工作:Dir [「#{Rails.root}/{test,spec}/fixtures/*。yml」] – bronson

+0

僅供參考,Rails 4.2.1棄用警告。使用'ActiveRecord :: FixtureSet'而不是'ActiveRecord :: Fixtures'。 –

1

有趣的問題。

不知道這是否有幫助,但加載燈具的實際邏輯似乎是坐在active_record/fixtures.rb - 尤其是看看ActiveRecord::TestFixtures::ClassMethods#fixtures這是您通常在TestCase子類中調用的宏。

這個邏輯似乎很好地包含在ActiveRecord::TestFixtures模塊中,所以也許你可以嘗試推出你自己的包含該模塊的類,並要求它在控制檯中。 (看起來你需要在使用燈具之前實例化這個類,因爲模塊生成的方法是實例方法)

+0

謝謝。我探索了TextFixtures代碼並嘗試了一些控制檯實驗,但無法獲得任何工作。當我有一些自由的時刻,我會繼續嘗試。 –

0

我們使用這個效果很好,與FactoryGirl

如果你能夠使用factory_girl,它具有一些非常好的功能,用於混合特徵和工廠繼承。與工廠女孩,通過規格訪問它,並通過控制檯訪問它非常相似。

require 'factory_girl' 
user = FactoryGirl.create(:user) 

如果使用bundler,您可以爲您的開發和測試環境的瑰寶組,其中包括工廠的女孩,那麼你就不會在開發使用控制檯時需要需要它。

group :development, :test do 
    gem 'factory_girl' 
end 
+0

過去我曾多次試過FactorGirl,並且一旦遇到需要在多個對象之間設置複雜關係的情況,就會立即遇到磚牆。我不記得任何具體的東西,除了在我口中的酸味工廠口味。在絕大多數情況下,我會希望在擁有大量已建立和工作固定裝置的成熟項目上完成此項工作,並試圖將所有這些轉換爲FactoryGirl,只是爲了獲得這一好處,可能不會成爲我的明智用途。時間。 –

+0

雖然這不完全是您要查找的內容,但您可以按照此處列出的步驟操作:http://stackoverflow.com/a/7905915/107840。這使用rake db:fixtures:load任務。 –

+0

我看着Fixture的源代碼,它看起來並不簡單。 TestFixtures模塊確實需要包含在m-x中。但是,您的實例需要設置/拆卸回調,誰知道還有什麼。如果在控制檯中訪問燈具數據是我們真正需要的功能,那麼我真的認爲您應該使用factory_girl或燈具的不同替代方案。如果你有興趣,我可以給你一些提示,讓你和factory_girl一起去​​。 –

0

對方回答是不完整的,你需要告訴FactoryGirl加載定義:

require 'factory_girl' 
FactoryGirl.find_definitions 
user = FactoryGirl.create(:user) 

有關詳細信息,請參閱docs

2

我希望我可以增加Jon Garvin的出色答案。這就像他的版本,但不使用method_missing(在全局上下文中有點嚇人,不允許tab完成)。此外,它會一直等到您在加載燈具之前從irb調用load_fixtures。

將其插入.irbrc或從此處粘貼。

# Loads all fixtures, then defines the Rails fixture helpers. 
# For example: users(:jon) will load the jon fixture from fixtures/users.yml 
def load_fixtures 
    require 'active_record/fixtures' 
    Dir["#{Rails.root}/{test,spec}"].each do |dir| 
    Dir["#{dir}/fixtures/*.yml"].map { |filename| filename.match(/\/([^\/]+)\.yml/)[1].to_sym }.each do |name| 
     ActiveRecord::FixtureSet.create_fixtures('spec/fixtures', name) 
     define_method(name) { |*args| 
     name.to_s.singularize.titleize.constantize.find(ActiveRecord::FixtureSet.identify(args[0])) 
     } 
    end 
    end 
end 

用法示例:

$ irb 
irb(main):001:0> load_fixtures 
=> ["oweto/spec"] 
irb(main):002:0> users(:chuy) 
=> #<User id: 242462757, email: "[email protected]", password_digest: ...>