2015-07-23 10 views
6

Nella mia app ho diverse classi Builder che sono responsabili per prendere i dati ricevuti da una richiesta API esterna e costruire/salvare risorse nel database. Ho a che fare con una grande quantità di dati e ho implementato la gemma Parallel per accelerare l'uso di più processi.RSpec: Come testare metodi che usano Parallel (errore PG :: ConnectionBad)

Tuttavia, ho constatato che qualsiasi test per un metodo che utilizza parallelo viene a mancare con lo stesso errore:

ActiveRecord::StatementInvalid: 
    PG::ConnectionBad: PQconsumeInput() server closed the connection unexpectedly 
    This probably means the server terminated abnormally 
    before or while processing the request. 

Ecco un esempio del codice in fase di test:

class AirportBuilder < Resource 
    def build_from_collection 
    Parallel.each(object_producer, in_processes: 24) do |params| 
     instance = Airport.find_or_initialize_by(fsid: params[:fs]) 
     build!(instance, params) 
    end 
    end 
end 

I Ho fatto qualche ricerca su questo, ma tutti i risultati di Google hanno a che fare con l'utilizzo di più thread/processi per far funzionare la suite di test più velocemente, il che è un problema diverso.

Qualche idea su come posso testarlo efficacemente senza causare l'errore PG? Mi rendo conto che potrei aver bisogno di mozzare qualcosa, ma non sono abbastanza sicuro di cosa mozzare e avere ancora un test significativo.

Grazie in anticipo a chiunque potrebbe essere in grado di aiutare!

risposta

1

Si stanno utilizzando troppe connessioni database rispetto a quelle configurate per il database di test? Forse prova a impostarlo su una dimensione del pool uguale alle esigenze del tuo script (che assomiglia a 24)?

test: adapter: whatever host: whatever username: whatever password: whatever database: whatever pool: 24

Heads up che si può anche voler fare un po 'di matematica su the default ActiveRecord connection pool. Alcune buone informazioni in this Heroku dev center article.