レンチコンソールからテストフィクスチャファインダー(例:users(:david)
)を使用したいことがよくあります。コンソールプロンプトでロードできる特定のRailsモジュール、またはインストール可能な宝石がありますか?Railsコンソール内でフィクスチャファインダーヘルパーを使用する
Google Oracleのクエリは何も変わっていないので、私は息を止めていませんが、ここの誰かが秘密を知っていて、分かち合うことを願っています。
レンチコンソールからテストフィクスチャファインダー(例:users(:david)
)を使用したいことがよくあります。コンソールプロンプトでロードできる特定のRailsモジュール、またはインストール可能な宝石がありますか?Railsコンソール内でフィクスチャファインダーヘルパーを使用する
Google Oracleのクエリは何も変わっていないので、私は息を止めていませんが、ここの誰かが秘密を知っていて、分かち合うことを願っています。
自分自身を考え出しました。 これは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元の質問には、この時点までに役立ちました。
残念ながら、このコードをコンソールに貼り付けることはできません。この問題を回避するには、fixture_namesメソッドとfixture_idメソッドを最初に貼り付けます(したがって、method_missingは無限に再帰しません)。 – bronson
fixture_namesを少し変更すると、rspecベースのフィクスチャーも動作します:Dir ["#{Rails.root}/{test、spec}/fixtures/*。yml"] – bronson
FYI、Rails 4.2.1 deprecation warning。 'ActiveRecord :: Fixtures'の代わりに' ActiveRecord :: FixtureSet'を使用してください。 –
興味深い質問です。
これは役立つかどうかわかりませんが、実際のロジックをロードするのはactive_record/fixtures.rbです。特にActiveRecord::TestFixtures::ClassMethods#fixtures
をご覧ください。これは通常、TestCase
子クラス内で呼び出すマクロです。
ロジックはActiveRecord::TestFixtures
モジュール内によく含まれているようですので、そのモジュールを含む独自のクラスをロールしてコンソールに必要とする可能性があります。 (モジュールで生成されたメソッドはインスタンスメソッドなので、このクラスをインスタンス化する必要があるようです。
ありがとうございます。私はTextFixturesのコードを調べていくつかのコンソール実験を試みましたが、何も動かすことができませんでした。私はいくつかの自由な瞬間を持って実験を続けます。 –
FactoryGirlでこれを最大限に活用します。
factory_girlを使用できるのであれば、特性と工場の継承を混在させるための素晴らしい機能がいくつかあります。工場の女の子の場合、スペックを介してアクセスし、コンソールからアクセスするのは非常に似ています。開発にコンソールを使用しているときにbundlerを使用している場合
require 'factory_girl'
user = FactoryGirl.create(:user)
、あなたは工場出荷時の女の子を含み、開発およびテスト環境用の宝石のグループを作成することができ、その後、あなたはそれを必要とする必要はありません。
group :development, :test do
gem 'factory_girl'
end
私はFactorGirlを過去に何回か試してみましたが、複数のオブジェクト間に複雑な関係を設定する必要があるとすぐにレンガの壁にぶつかりました。私は口に非常に酸っぱい風味の味以外の細部を覚えていない。ほとんどの場合、ほとんどの場合、成熟したプロジェクトでこれをやりたいと思うでしょう.FactoryGirlへのすべてのものをこの1つの利益のためだけに変換しようとすると、おそらく私の賢明な使用ではありません時間。 –
これはあなたが探しているものではありませんが、ここに記載されている手順に従うことができます:http://stackoverflow.com/a/7905915/107840 rake db:fixtures:loadタスクを使用します。 –
Fixtureのソースコードを調べたところ、単純ではありません。 TestFixturesモジュールはm-xとして表示する必要があります。ただし、インスタンスにはセットアップ/ティアダウンコールバックが必要で、他に何が分かっているかが分かります。もう一度、実際に必要な機能がコンソールのフィクスチャ・データにアクセスする場合は、factory_girlやフィクスチャーの別の代替方法を使用すべきだと思います。興味があれば、factory_girlに行くためのヒントをいくつか教えてもらえます。 –
他の答えが不完全である、あなたは定義をロードするFactoryGirlを指示する必要があります:
require 'factory_girl'
FactoryGirl.find_definitions
user = FactoryGirl.create(:user)
は詳細についてはdocsを参照してください。
私は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: ...>
あなたには、いくつかのfactory_girlポインタをしたいなら、私に知らせてください。私はあなたが現在あなたのフィクスチャで扱っている複雑さを管理するのに十分強力だと確信しています。 –