2011-12-13 3 views
8

레일스 콘솔에서 테스트 픽스쳐 찾기 (예 : users(:david))를 사용하고 싶습니다. 콘솔 프롬프트에서로드 할 수있는 특정 Rails 모듈이 있습니까? 아니면 설치할 수있는 보석을 사용할 수 있습니까?레일 콘솔 내의 조명기 찾기 도우미 사용

Google 오라클에 대한 내 검색어가 아무 것도 밝히지 않았으므로 숨을 멈추지 않고 있지만 여기에있는 누군가가 비밀을 알고 공유 할 수 있기를 바랍니다.

+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 파일이 있다고 가정하고 여기에 포함 된 레일 콘솔에서 다음 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 deprecation 경고. '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로 변환하려고하면,이 한가지 이점만으로도 저의 장점을 얻지 못할 것입니다. 시각. –

+0

이것이 정확히 원하는 것은 아니지만 http://stackoverflow.com/a/7905915/107840에 나와있는 단계를 수행 할 수 있습니다. 이것은 rake db : fixtures : load 작업을 사용합니다. –

+0

Fixture 소스 코드를 살펴본 결과 간단하지가 않습니다. TestFixtures 모듈은 m-x로 표시해야합니다. 그러나 인스턴스에 setup/teardown 콜백이 필요하고 그 외에는 다른 것을 알 수 있습니다. 다시 한번 말하지만, 콘솔의 조명기 데이터에 액세스하는 것이 정말로 필요한 기능인 경우 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: ...>