2011-12-13 10 views
8

Często stwierdzam, że chciałbym móc korzystać z wyszukiwarki urządzeń testowych (np. users(:david)) z konsoli Rails. Czy istnieje konkretny moduł Railsowy, który mogę wczytać w wierszu konsoli, lub klejnot, który mogę zainstalować, aby były one dostępne?Korzystanie z pomocników znajdowania urządzeń w konsoli Railsowej

Moje zapytania do Google Oracle nie podniosły nic, więc nie wstrzymuję oddechu, ale mam nadzieję, że ktoś tutaj na SO zna sekret i chętnie się z nim podzieli.

+0

daj mi znać, jeśli chcesz kilka wskazówek factory_girl. Jestem pewien, że jest wystarczająco potężny, aby poradzić sobie z jakąkolwiek złożonością, z którą obecnie się borykasz w swoich urządzeniach. –

Odpowiedz

7

Sam to wymyśliłem. Działa to zarówno z IRB, jak i Pry. Wystarczy dodać następujące linie do mojego pliku .irbrc (i/lub .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 

Teraz, zakładając, że jest to plik test/fixtures/users.yml i zawiera osprzętu nazwie diane:, potem users(:diane) z konsoli Rails z powodzeniem wraca że użytkownik.

m_x's answer na oryginalne pytanie było pomocne w osiągnięciu tego punktu.

+0

Niestety tego kodu nie można wkleić do konsoli. Aby obejść to, wklej najpierw metody fixture_names i fixture_id (aby metoda method_missing nie rekursowała się w nieskończoność), a następnie wklej resztę. – bronson

+0

A mała zmiana w nazwie urządzenia umożliwiłaby działanie urządzeń opartych na rspec: Dir ["# {Rails.root}/{test, spec}/fixtures/*. Yml"] – bronson

+0

Ostrzeżenie FYI, Rails 4.2.1 o wycofaniu. Użyj 'ActiveRecord :: FixtureSet' zamiast' ActiveRecord :: Fixtures'. –

1

Interesujące pytanie.

nie wiem, czy to pomoże, ale rzeczywista logika załadować urządzeń wydaje się siedzieć w active_record/fixtures.rb - szczególnie przyjrzeć się ActiveRecord::TestFixtures::ClassMethods#fixtures który jest makro zazwyczaj nazywają wewnątrz klasy TestCase dziecięcej.

Logika wydaje się być dobrze zawarta w module ActiveRecord::TestFixtures, więc może mógłbyś spróbować przetasować własną klasę, która zawiera ten moduł i wymagać go w konsoli. (Wydaje się, że będziesz musiał utworzyć instancję tej klasy przed uzyskaniem dostępu do urządzeń, ponieważ metody generowane przez moduł są metodami instancji).

+0

Dzięki. Zbadałem kod TextFixtures i wypróbowałem kilka eksperymentów z konsolami, ale nie udało mi się uzyskać niczego do pracy. Będę eksperymentował, kiedy będę miał wolne chwile. –

0

Używamy tego do uzyskania doskonałego efektu dzięki FactoryGirl.

Jeśli możesz użyć factory_girl, ma kilka naprawdę fajnych funkcji do mieszania cech i dziedziczenia fabryki. Z dziewczyną z fabryki, dostęp do niej za pośrednictwem specyfikacji i dostęp do niej za pośrednictwem konsoli są bardzo podobne.

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

Jeśli używasz bundler, można utworzyć grupę gem dla swoich środowisk programistycznych i testowych, które obejmuje Dziewczyna z fabryki, to nie trzeba będzie wymagać go podczas korzystania z konsoli w rozwoju.

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

Próbowałem FactorGirl kilka razy w przeszłości, i zawsze wpadałem na ceglane ściany, gdy tylko potrzebowałem ustawić złożone relacje między wieloma obiektami. Nie pamiętam w ustach żadnych szczegółów poza smakiem o bardzo kwaśnym, fabrycznym smaku. Niemniej jednak, w większości przypadków, chciałbym to zrobić w dojrzałych projektach z wieloma ustalonymi i działającymi instalacjami i próbując przekonwertować to wszystko na FactoryGirl, właśnie dlatego, że ta jedna korzyść prawdopodobnie nie byłaby mądrym wykorzystaniem mojego czas. –

+0

Chociaż nie jest to dokładnie to, czego szukasz, możesz wykonać opisane tutaj czynności: http://stackoverflow.com/a/7905915/107840. Wykorzystuje to prowizję db: fixtures: load task. –

+0

Zajrzałem do kodu źródłowego Fixture i nie wygląda to na proste. Moduł TestFixtures musi być dołączony jako wskazany m-x. Jednak Twoja instancja musi mieć wywołania zwrotne konfiguracji/odkładania i kto wie co jeszcze. Jeszcze raz uważam, że powinieneś użyć factory_girl lub innej alternatywy dla urządzeń, jeśli dostęp do danych urządzenia w konsoli jest funkcją, której naprawdę potrzebujesz. Mogę dać ci kilka wskazówek, które pozwolą ci pójść z factory_girl, jeśli jesteś zainteresowany. –

0

Druga odpowiedź jest niekompletna, trzeba powiedzieć FactoryGirl załadować definicje:

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

Zobacz docs więcej szczegółów.

2

Chciałbym dodać doskonałą odpowiedź Jona Garvina. Jest to podobne do jego wersji, ale nie używa metody method_missing (która jest trochę przerażająca w kontekście globalnym i nie pozwala na jej zakończenie). Czeka również, aż wywołasz load_fixtures z irb przed załadowaniem urządzeń.

Włóż to do pliku .irbrc lub po prostu wklej tutaj.

# 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 

Przykład użycia:

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