Generalmente è una cattiva idea richiedere l'avvio di un altro servizio/applicazione per far passare i test dell'unità. Questo tipo di interazione viene in genere verificato da risposte mocking o vcring o creando test di ambiente che vengono eseguiti su server distribuiti. L'avvio di un altro server è al di fuori dell'ambito di rspec e in generale, come hai scoperto, causerà un sacco di mal di testa da configurare e mantenere.
Tuttavia, se hai intenzione di avere questi progetti di binari strettamente accoppiati e vuoi che condividano le risorse, ti suggerisco di investigare su Rails Engines. Per fare ciò è necessaria una notevole quantità di lavoro, ma i vantaggi possono essere piuttosto elevati in quanto il codice condividerà un repository e avrà accesso alle reciproche capacità, mantenendo l'isolamento delle applicazioni.
I motori creano efficacemente un'applicazione di rotaia all'interno di un'altra applicazione di rotaie. Ogni applicazione ha il proprio spazio dei nomi e alcune protezioni isolanti per impedire la contaminazione delle app cross. Se disponi di molti motori, diventa ideale avere un'applicazione di shell shell con funzionalità minime che servono ciascun motore su un percorso/spazio dei nomi diverso.
Per prima cosa è necessario creare un alloggiamento per il nuovo motore api.
$ rails plugin new apiserver --mountable
Questo vi fornirà lib/apiserver/engine.rb
così come tutte le altre impalcature è necessario eseguire il vostro API come un motore. Noterai inoltre che config/routes.rb
ha ora un percorso per il tuo motore. Puoi copiare i percorsi esistenti in questo modo per fornire un percorso percorso per il tuo motore.Tutti i modelli esistenti dovranno essere spostati nello spazio dei nomi e sarà necessario migrare qualsiasi tabella associata alla nuova convenzione di denominazione. Avrai anche alcune modifiche personalizzate a seconda dell'applicazione e di ciò che devi copiare sul motore, tuttavia la guida delle guide ti guida attraverso queste modifiche (non le enumereremo tutte qui).
Ci è voluta una collega circa una settimana di lavoro per ottenere un motore complicato copiato in un altro server di rotaie complicato mentre lo sviluppo su entrambe le app stava avvenendo e conservando la cronologia del controllo della versione. Un'app più semplice - come un servizio solo API - Immagino che sarebbe più veloce da stabilire.
Ciò che questo ti dà è un altro ambito di namespace nella root dell'applicazione. È possibile modificare questa configurazione mentre si aggiungono più motori e codice condiviso per adattarsi a varie altre strutture di directory che hanno più senso.
app
models
...
apiserver
app
...
E una volta che hai spostato il codice nel motore, è possibile testare contro i router del motore:
require "rails_helper"
describe APIServer::UsersController do
routes { APIServer::Engine.routes }
it "routes to the list of all users" do
expect(:get => users_path).
to route_to(:controller => "apiserver/users", :action => "index")
end
end
si dovrebbe essere in grado di mescolare e abbinare rotte da entrambi i servizi e ottenere cross- test delle applicazioni eseguiti senza avviare un'app Rails separata e senza richiedere un ambiente di integrazione per il passaggio delle specifiche.
Task rabbit ha un great blog su come generare un'applicazione di rota come riferimento. Si immergono in ciò che cosa fare e cosa no-to-fare in enginizing e andare in profondità più di quanto possa essere facilmente trascritto in un post SO. Suggerirei di seguire la loro procedura per prendere decisioni sul motore, anche se non è certamente necessario per avviare correttamente il tuo server API.
https://github.com/rails/rails/blob/3e36db4406beea32772b1db1e9a16cc1e8aea14c/railties/lib/rails/application.rb#L58 Come puoi vedere qui, puoi solo inizializzare un binario senza sovrascrivere l'inizializzatore in 'Rails :: Application' –
quindi se davvero pensi di volerlo fare, puoi sovrascrivere il metodo 'initialize' di' Rails :: Application' prima di richiedere il file 'environment' della seconda app –
Thanks Yury. Ho appena dato un'occhiata al tuo suggerimento e non riesco ancora a capirlo, continuerò a guardare in questa direzione. O forse qualcosa può essere fatto in Capibara. – Benj