Ruby on rails 在Rails控制台中使用fixture finder辅助工具

Ruby on rails 在Rails控制台中使用fixture finder辅助工具,ruby-on-rails,ruby,console,fixtures,Ruby On Rails,Ruby,Console,Fixtures,我经常发现我希望能够从Rails控制台使用测试夹具查找器(例如用户(:david))。是否有一个特定的Rails模块可以在控制台提示符下加载,或者有一个gem可以安装,从而使这些模块可用 我对谷歌甲骨文的查询并没有任何结果,所以我不会屏住呼吸,但我希望在座的人知道一个秘密,并愿意与大家分享。有趣的问题 不知道这是否有帮助,但加载fixture的实际逻辑似乎很重要-特别是看看ActiveRecord::TestFixtures::ClassMethods#fixtures,这是通常在TestCas

我经常发现我希望能够从Rails控制台使用测试夹具查找器(例如
用户(:david)
)。是否有一个特定的Rails模块可以在控制台提示符下加载,或者有一个gem可以安装,从而使这些模块可用

我对谷歌甲骨文的查询并没有任何结果,所以我不会屏住呼吸,但我希望在座的人知道一个秘密,并愿意与大家分享。

有趣的问题

不知道这是否有帮助,但加载fixture的实际逻辑似乎很重要-特别是看看
ActiveRecord::TestFixtures::ClassMethods#fixtures
,这是通常在
TestCase
子类中调用的宏


逻辑似乎很好地包含在
ActiveRecord::TestFixtures
模块中,因此您可以尝试滚动包含该模块的自己的类,并在控制台中需要它。(在访问fixture之前,您似乎需要实例化这个类,因为模块生成的方法都是实例方法)

我们使用它非常有效

如果您能够使用factory_girl,那么它有一些非常好的特性,可以混合特性和工厂继承。对于factory girl,通过specs访问它和通过控制台访问它非常相似

require 'factory_girl'
user = FactoryGirl.create(:user)
如果使用,您可以为您的开发和测试环境创建一个包含factory girl的gem组,那么在开发中使用控制台时就不需要它了

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

我自己想出来的这适用于IRB和。只需将以下行添加到my.irbrc(和/或.pryrc)文件中即可

现在,假设有一个
test/fixtures/users.yml
文件,其中包含一个名为
diane:
的fixture,那么Rails控制台中的
users(:diane)
将成功返回该用户


原始问题的m_x有助于达到这一点。

另一个答案不完整,您需要告诉FactoryGirl加载定义:

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

有关更多详细信息,请参阅。

我希望能够补充Jon Garvin的精彩答案。这和他的版本一样,但没有使用方法_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: "chuy@example.com", password_digest: ...>
$irb
irb(主):001:0>加载固定装置
=>[“oweto/spec”]
irb(主):002:0>用户(:chuy)
=> #

过去我曾多次尝试使用FactorGril,每次需要在多个对象之间建立复杂关系时,都会遇到困难。我记不起任何细节,只记得我嘴里有一种非常酸的工厂风味。尽管如此,在大多数情况下,我还是希望在成熟的项目上做这件事,有很多固定装置和工作装置,而仅仅为了这一点,试图把所有这些都转换成FactoryGirl可能不是明智地利用我的时间。虽然这不正是你想要的,您可以按照此处概述的步骤进行操作:。这使用了rakedb:fixtures:load任务。TestFixtures模块确实需要包括在m-x中。但是,您的实例需要有安装/拆卸回调,谁知道还有什么。再一次,如果在控制台中访问夹具数据是您真正需要的功能,我真的认为您应该使用factory_girl或夹具的其他替代品。如果你有兴趣的话,我可以给你一些建议,让你和工厂女孩一起去。谢谢。我研究了TextFixtures代码,并尝试了一些控制台实验,但没有任何结果。当我有空的时候,我会继续尝试。如果你想要一些工厂女孩的指针,请告诉我。我确信它足够强大,可以管理您当前在fixture中处理的任何复杂性。不幸的是,此代码无法粘贴到控制台中。为了解决这个问题,首先粘贴fixture_名称和fixture_id方法(这样方法_missing不会递归到无穷大),然后粘贴其余的。对fixture_名称进行一个小的更改将允许基于rspec的fixture也工作:Dir[“{Rails.root}/{test,spec}/fixtures/*.yml”]FYI,Rails 4.2.1弃用警告。使用
ActiveRecord::FixtureSet
而不是
ActiveRecord::Fixtures
$ irb
irb(main):001:0> load_fixtures
=> ["oweto/spec"]
irb(main):002:0> users(:chuy)
=> #<User id: 242462757, email: "chuy@example.com", password_digest: ...>