2011-12-13 10 views
8

Tôi thường thấy rằng tôi muốn có thể sử dụng công cụ tìm vật cố thử nghiệm (ví dụ: users(:david)) từ bảng điều khiển Rails. Có một mô-đun Rails cụ thể tôi có thể tải tại dấu nhắc giao diện điều khiển, hoặc một viên ngọc tôi có thể cài đặt, mà có thể làm cho chúng có sẵn không?Sử dụng công cụ tìm vật cố trong bảng điều khiển Rails

Truy vấn của tôi về Google Oracle đã không chuyển bất cứ điều gì, vì vậy tôi không nín thở, nhưng tôi hy vọng ai đó ở đây trên SO biết bí mật và sẵn sàng chia sẻ.

+0

cho tôi biết nếu bạn muốn một số gợi ý factory_girl. Tôi chắc chắn rằng nó đủ mạnh để quản lý bất cứ điều gì phức tạp mà bạn đang xử lý trong đồ đạc của bạn. –

Trả lời

7

Tự tìm hiểu. Điều này hoạt động với cả IRB và Pry. Chỉ cần thêm các dòng sau vào tệp .irbrc (và/hoặc .pryrc) của tôi.

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 

Bây giờ, giả sử rằng có một tập tin test/fixtures/users.yml và nó có chứa một vật cố tên diane:, sau đó users(:diane) từ Rails console thành công trả về mà dùng.

m_x's answer cho câu hỏi ban đầu là hữu ích khi đạt đến điểm này.

+0

Rất tiếc, không thể dán mã này vào bảng điều khiển. Để giải quyết vấn đề này, trước tiên hãy dán các phương thức fixture_names và fixture_id (để method_missing không recurse vào vô cùng), sau đó dán phần còn lại. – bronson

+0

Và một thay đổi nhỏ đối với fixture_names sẽ cho phép các đồ thị dựa trên rspec hoạt động: Dir ["# {Rails.root}/{test, spec}/fixtures/*. Yml"] – bronson

+0

Cảnh báo ngừng sử dụng FYI, Rails 4.2.1. Sử dụng 'ActiveRecord :: FixtureSet' thay vì' ActiveRecord :: Fixtures'. –

1

Câu hỏi thú vị.

Không biết điều đó có hữu ích hay không, nhưng logic thực tế để tải đồ đạc có vẻ như nằm trong active_record/fixtures.rb - đặc biệt là xem ActiveRecord::TestFixtures::ClassMethods#fixtures là macro bạn thường gọi bên trong lớp con TestCase.

Logic dường như được chứa trong mô-đun ActiveRecord::TestFixtures, vì vậy có thể bạn có thể thử cuộn lớp của riêng bạn bao gồm mô-đun đó và yêu cầu nó trong bảng điều khiển. (có vẻ như bạn sẽ cần phải khởi tạo lớp này trước khi acessing đồ đạc mặc dù, như các phương pháp được tạo ra bởi các mô-đun là phương pháp dụ)

+0

Cảm ơn. Tôi đã khám phá mã TextFixtures và thử một vài thí nghiệm trên bàn điều khiển, nhưng không thể làm được gì cả. Tôi sẽ tiếp tục thử nghiệm khi tôi có một số khoảnh khắc miễn phí. –

0

Chúng tôi sử dụng điều này để có hiệu lực tuyệt vời với FactoryGirl.

Nếu bạn có thể sử dụng factory_girl, nó có một số tính năng thực sự tốt đẹp để trộn trong các đặc điểm và thừa kế nhà máy. Với cô gái nhà máy, truy cập thông qua thông số kỹ thuật và truy cập thông qua bảng điều khiển rất giống nhau.

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

Nếu bạn sử dụng bundler, bạn có thể tạo một nhóm đá quý cho sự phát triển và thử nghiệm môi trường của bạn, bao gồm nhà máy cô gái, sau đó bạn sẽ không cần phải yêu cầu nó khi sử dụng giao diện điều khiển trong phát triển.

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

Tôi đã thử FactorGirl vài lần trong quá khứ và luôn chạy vào tường gạch ngay sau khi tôi cần thiết để thiết lập các mối quan hệ phức tạp giữa nhiều đối tượng. Tôi không thể nhớ bất kỳ chi tiết cụ thể nào ngoài mùi vị của một nhà máy rất chua trong miệng của tôi. Không bao giờ ít hơn, trong hầu hết các trường hợp, tôi muốn làm điều này trên các dự án trưởng thành với rất nhiều đồ đạc đã được thiết lập và làm việc, và cố gắng chuyển đổi tất cả những thứ đó sang FactoryGirl chỉ vì lợi ích này có lẽ sẽ không phải là cách sử dụng khôn ngoan của tôi thời gian. –

+0

Mặc dù đây không phải là chính xác những gì bạn đang tìm kiếm, bạn có thể làm theo các bước được nêu ở đây: http://stackoverflow.com/a/7905915/107840. Điều này làm cho việc sử dụng lệnh rake db: fixtures: load. –

+0

Tôi nhìn vào mã nguồn của Lịch thi đấu và nó không đơn giản. Các mô-đun TestFixtures không cần phải được bao gồm như m-x chỉ định. Tuy nhiên, trường hợp của bạn cần phải có thiết lập/teardown callbacks và những người hiểu biết những gì khác. Một lần nữa, tôi thực sự nghĩ bạn nên sử dụng factory_girl hoặc một giải pháp thay thế khác cho đồ đạc, nếu truy cập dữ liệu lịch thi đấu trong bảng điều khiển là một tính năng bạn thực sự cần. Tôi có thể cung cấp cho bạn một số mẹo để giúp bạn đi với factory_girl nếu bạn quan tâm. –

0

Câu trả lời khác là không đầy đủ, bạn cần phải nói cho FactoryGirl để tải các định nghĩa:

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

Xem docs để biết thêm chi tiết.

2

Tôi ước mình có thể thêm vào câu trả lời tuyệt vời của Jon Garvin. Điều này giống như phiên bản của anh ta nhưng không sử dụng method_missing (điều này khá đáng sợ trong bối cảnh toàn cục và không cho phép hoàn thành tab). Ngoài ra, nó chờ đợi cho đến khi bạn gọi load_fixtures từ irb trước khi tải đồ đạc của bạn.

Chèn mã này vào .irbrc hoặc chỉ dán từ đây.

# 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 

Ví dụ sử dụng:

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