2011-12-13 8 views
8

レンチコンソールからテストフィクスチャファインダー(例:users(:david))を使用したいことがよくあります。コンソールプロンプトでロードできる特定のRailsモジュール、またはインストール可能な宝石がありますか?Railsコンソール内でフィクスチャファインダーヘルパーを使用する

Google Oracleのクエリは何も変わっていないので、私は息を止めていませんが、ここの誰かが秘密を知っていて、分かち合うことを願っています。

+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

FYI、Rails 4.2.1 deprecation warning。 'ActiveRecord :: Fixtures'の代わりに' ActiveRecord :: FixtureSet'を使用してください。 –

1

興味深い質問です。

これは役立つかどうかわかりませんが、実際のロジックをロードするのはactive_record/fixtures.rbです。特にActiveRecord::TestFixtures::ClassMethods#fixturesをご覧ください。これは通常、TestCase子クラス内で呼び出すマクロです。

ロジックはActiveRecord::TestFixturesモジュール内によく含まれているようですので、そのモジュールを含む独自のクラスをロールしてコンソールに必要とする可能性があります。 (モジュールで生成されたメソッドはインスタンスメソッドなので、このクラスをインスタンス化する必要があるようです。

+0

ありがとうございます。私はTextFixturesのコードを調べていくつかのコンソール実験を試みましたが、何も動かすことができませんでした。私はいくつかの自由な瞬間を持って実験を続けます。 –

0

FactoryGirlでこれを最大限に活用します。

factory_girlを使用できるのであれば、特性と工場の継承を混在させるための素晴らしい機能がいくつかあります。工場の女の子の場合、スペックを介してアクセスし、コンソールからアクセスするのは非常に似ています。開発にコンソールを使用しているときにbundlerを使用している場合

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

、あなたは工場出荷時の女の子を含み、開発およびテスト環境用の宝石のグループを作成することができ、その後、あなたはそれを必要とする必要はありません。

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

私はFactorGirlを過去に何回か試してみましたが、複数のオブジェクト間に複雑な関係を設定する必要があるとすぐにレンガの壁にぶつかりました。私は口に非常に酸っぱい風味の味以外の細部を覚えていない。ほとんどの場合、ほとんどの場合、成熟したプロジェクトでこれをやりたいと思うでしょう.FactoryGirlへのすべてのものをこの1つの利益のためだけに変換しようとすると、おそらく私の賢明な使用ではありません時間。 –

+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は使用されません(これはグローバルコンテキストでは恐ろしく、タブの補完はできません)。また、灯具をロードする前に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: ...> 
関連する問題