####Witam.
Próbuję stworzyć system składający się z głównej aplikacji (nazwijmy ją ‘core’) oraz grupy modułów, które w razie konieczności mogłyby być podłączane lub odłączane poprzez dodawanie lub usuwanie ich z Gemfile głównej aplikacji.
Udało mi się już stworzyć podwaliny pod tą aplikację, tzn. trzymam tworzone engine’y w folderze poza aplikacją core i dołączam je do niej poprzez Gemfile:
path '../extensions' do
gem 'sample_gem'
end
Problem polega na tym, że w ramach tego projektu staram się również nauczyć testowania (rspec / factory_girl) i nie za bardzo mi to idzie. W ramach core wszystko działa i mogę skupić się na pisaniu testów, natomiast mam problem z ogarnięciem sensownego sposobu na testowanie modułów (gemów).
###Przykładowa sytuacja:
W core mam model User.
Mam również engine ‘api’, który po dodaniu go do core wzbogaca aplikację o kontroler Users dostępny w odpowiednim namespace /api/users
oraz konieczne route’y itp. Mechanizm działa. Teraz chcę to przetestować i tutaj zaczynają się schody.
# extensions/api/api.gemspec
# ...
# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"]
s.test_files = Dir["spec/**/*"]
s.add_dependency 'rails', '~> 5.0'
s.add_dependency 'mysql2', '>= 0.3.18', '< 0.5'
s.add_development_dependency 'rspec-rails'
s.add_development_dependency 'factory_girl_rails'
end
# extensions/api/spec/requests/users_spec.rb
describe "Users list API", type: :request do
it "tries to get a JSON list of users" do
get "/api/users", headers: { ACCEPT: 'application/json' }
expect(response.content_type).to eq("application/json")
expect(response).to have_http_status(:ok)
end
end
Pliki spec_helper.rb
oraz rails_helper.rb
były niezmieniane (wygenerowane automatycznie przez rspec:install).
Po uruchomieniu testów rspec zwraca błąd, że metoda get
nie istnieje.
Ten sam test uruchomiony w ramach core działa bez problemu, lecz nie chcę zamieszczać testów modułów w głównej aplikacji.
Gdy w rails_helper.rb zmieniłem ścieżkę do pliku environment na taką, aby wskazywała główną aplikację, nic się nie zmieniło.
###Co chcę osiągnąć?
- Testy dla każdego gema w jego źródłach aby nie zaśmiecać niepotrzebnie core
- Korzystanie z core jako dummy dla wszystkich gemów (żaden z nich na ten moment nie będzie musiał pracować z żadną inną aplikacją, do tego wiele z nich będzie odwoływać się do modeli z core)
- Uniknięcie dopisywania w gemspec każdego modułu wszystkich zależności, których wymaga core - najlepiej jakby po prostu wymagało core - nie mam pomysłu jak to w miarę elegancko osiągnąć w sposób inny niż tworzenie samego core jako gema. Chyba, że to po prostu najlepsze wyjście to będę wdzięczny za wyjaśnienie dlaczego
- Idealnie byłoby gdyby po dołączeniu gema do core, uruchomienie testów dla core automatycznie odpalało również testy wszystkich podłączonych gemów
Będę bardzo wdzięczny za pomoc lub wskazówki na inne podejście do tego tematu, jeśli moje z jakiś powodów jest nędzne