2017-08-22 102 views
7

Testuję aplikację internetową z ruby, rspec, kapibara i selenu i wpadłem na uninitialized constant ActiveAdminLoginPage Wyjątek, którego nie potrafię rozwiązać.Dynamicznie utworzyć polecenie automatycznego ładowania z nazw plików w Ruby

W spec_helper.rb jestem wymagająca co następuje:

Dir[File.join(Dir.pwd, 'spec/page_objects/**/*.rb')].each { |f| require f } 

mam 2 klas

spec/page_objects/products/active_admin_login_page.rb 

module Products 
    class ActiveAdminLoginPage < ::ActiveAdminLoginPage 
    ... 
    end 
end 

dziedziczy

spec/page_objects/active_admin_login_page.rb 

niestety klasa sub jest załadowany przed rodzicem klasa.

Jak dynamicznie utworzyć polecenie autoload ze wszystkich nazw plików w katalogu? chciałbym zastąpić poleceniem:

Dir[File.join(Dir.pwd, 'spec/page_objects/**/*.rb')].each { |f| require f }

z poleceniem autoload.

+1

Jakie zachowanie można oczekiwać od autoload? Że automatycznie załaduje plik na podstawie brakującej stałej? Najprawdopodobniej będziesz musiał napisać "opakowanie", ponieważ ta funkcjonalność nie jest wbudowana. Pytanie brzmi, jak możesz się spodziewać, że się zachowa. Typowo ładujemy wszystkie zależności przez 'require (_relative)' dla każdego pliku. Aby wykonać pracę automatycznie, potrzebna jest relatywnie ścisła konwencja nazewnictwa do obliczania plików do załadowania. – insider

Odpowiedz

4

A może użyjesz require do załadowania zależności w pliku, który tego potrzebuje?

require ładuje plik tylko raz, więc nie powinieneś mieć żadnych skutków ubocznych.

Albo, jeszcze lepiej, można użyć auto_load, która wykorzystuje require pod maską, ale robi to w przemyślanego sposobu

autoload :ActiveAdminLoginPage, 'active_admin_login_page' 
+0

Wiem, że to by działało, ale wolę automatyczne ładowanie plików przez dodawanie wymaga ręcznego. Jeśli nie znajdę rozwiązania do automatycznego ładowania, idę do tego podejścia, ale zanim spróbuję automatycznie pobrać pliki. –

+0

czy wiesz, jak utworzyć symbol: ActiveAdminLoginPage z 'active_admin_login_page'? Ponieważ im czyta wszystkie pliki z katalogu page_object, muszę to zrobić dynamicznie. –

+0

Nie musisz robić nic specjalnego. Sprawdź http://lifeonubuntu.com/use-rubys-autoload-instead-of-require-for-your-ruby-and-rails-apps/ –