6

Chcę ustawić active_record_spec_helper dla moich testów Rails, tak aby móc przetestować moje modele bez konieczności konfigurowania całego środowiska Rails - zgodnie z ustaleniami Corey Haines w swoim excellent blog post on the subject.wymaga modelu ActiveRecord bez konieczności stosowania całego diagramu klas, dla active_record_spec_helper

(wiem, że obciążenia wstępnego jak wiosna lub Straży przejść część drogi w kierunku wyeliminowania tego problemu, ale zgadzam się z argumentem Coreya, że ​​jest to „naprawdę tylko zespół pomocy na prawdziwy problem”).

więc mam skonfigurować niespełniającego pomocnika i innych plików, jak określono w Coreya blogu i - ale mój problem jest dokładnie tak, jak opisano to w my comment na tej samej GIST:

Zasadniczo, związki między moimi modelami oznaczać aby przetestować jeden model, muszę require, tak wiele innych plików modeli, że neguje punktu korzystania z active_record_spec_helper w pierwszej kolejności .

E.g. jeśli chcę przetestować comment.rb, ale mój komentarz belongs_to :post, to muszę wymagać post, a także comment, aby moje testy zadziałały. Ale wtedy Post może mieć inne powiązania, np. belongs_to :user; has_many :drafts, więc muszę wymagać user i drafts, a także po to, aby przetestować Comment ... następnie user i drafts mają również skojarzenia, i tak dalej, aż w końcu ładuję praktycznie każdy model na moim diagramie klasowym.

(Jeśli to nie ma sensu, dałem bardziej szczegółowe wyjaśnienie w the comment.)

Czy to możliwe, aby obejść ten problem i uniknąć konieczności require te wszystkie obce pliki modelu? A może jest coś konceptualnego, którego mi brakuje - czy powinienem unikać łączenia wszystkich moich modeli w tej gigantycznej sieci, czy też jest to nieuniknione?

A może po prostu nie jest to warte wysiłku i czy powinienem się starać, aby całe środowisko było obciążone rails_helper?

Odpowiedz

2

Nie sądzę, że brakuje ci czegoś koncepcyjnego i myślę, że posiadanie modeli połączonych w gigantyczne sieci poprzez powiązania jest naturalne w dużych aplikacjach Railsowych.

Co do obejścia tego problemu, mogę pomyśleć o kilku:

  • skrótowe modele są zależała podczas testowania modeli, które bezpośrednio zależą od nich. To eliminuje potrzebę ładowania lub pośredniczenia modeli pośrednio zależnych od.

  • Włącz automatyczne ładowanie. Chociaż spowolni to działanie, nie jest to to samo, co uruchamianie wszystkich Railsów. Zamiast tylko wymieniać swoje zależności jako komentarze u góry modeli, jak sugerował Corey, należy je wyrazić w kodzie Ruby. Ten kod może być operacją "no-op", ale w teście możesz skonfigurować kod tak, aby wymagał lub zależał od zależności.

+0

Jak włączyć automatyczne ładowanie bez ładowania całej aplikacji Rails? Czy jest gdzieś w ActiveSupport? – GMA

+0

Mechanizm autoloadowy Ruby sam w sobie nie jest wystarczający i nie jestem pewien, czy/jak mechanizm Railsowy zbudowany na nim może być oddzielnie wywoływany. Prawdopodobnie nie powinienem być tak glib w opisywaniu tej opcji. Jeśli nie możesz znaleźć czegoś w klejnocie Railsów, który jest użyteczny, możesz przeczytać o możliwościach na stronie http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/, na przykład Skręć swój własny. –

0

Byłem w stanie rozwiązać ten problem za pomocą FactoryGirl. Proszę see my gist for details.

Używanie factory_girl_require_helper.rb, można zrobić coś takiego na początku testu:

require_factory_and_model_for(:comment) 

To będzie automatycznie załadować wszelkie związane z modeli, które są zależne od Comment oparciu o fabrycznie zdefiniowanego w to.