13

Il mio frontend è un'app basata su EmberJS. È totalmente asincrono in natura, quindi testarlo con Capybara è pain e misery. D'altra parte, Ember fornisce una fantastica suite di test, che rende i test di accettazione divertenti ed efficaci.Esecuzione di test di integrazione/accettazione sul frontend. Hai bisogno di un'API per il frontend per dire a Rails quale stato del database impostare per ogni test

Normalmente, sia le fixture che i backend mock vengono utilizzati per le applicazioni Ember con test di accettazione. Ma il test contro schernisce non mi soddisfa affatto:

  • Non rivelerà eventuali incongruenze API tra il backend e il frontend, condizioni di gara, ecc
  • È impossibile testare la logica di business di back-end in questo modo. Tali test sono non test di integrazione.
  • Infine, i test di accettazione richiedono la persistenza, quindi è necessario replicare il comportamento del backend in una simulazione. È molto noioso e in pratica finisci per implementare due backend.

Quindi voglio testare il vero back-end! È banale impostare Ember per utilizzare un'istanza di backend locale per il test. Ma il il problema è che il back-end continuerà il suo stato tra i singoli test e anche le sessioni di test.

Ecco perché sto pensando di realizzare una speciale API pubblica in Rails:

  • L'API è disponibile solo quando Rails è gestito con una bandiera specifico o un'env var.
  • I binari vengono eseguiti in una modalità non testata, servendo le normali chiamate API come nella produzione.
  • Prima di ogni test, il frontend chiama l'API speciale, dicendo a Rails quale configurazione del database è necessaria per questo test specifico.
  • Quando viene ricevuta una chiamata all'API speciale, Rails pulisce il database e lo popola con i dati richiesti. Ad esempio, per testare la cancellazione degli articoli dal carrello, il database dovrebbe avere tre articoli nel carrello.
  • Rails completa la richiesta API e il frontend avvia il test.
  • Il frontend esegue i passaggi di test, utilizzando la normale API di back-end come farebbe in produzione: accedere, creare post, commentarli. Proverà anche a fare alcune cose proibite, e. g. modificare i post senza aver effettuato l'accesso, superare i limiti di lunghezza del testo, ecc. e verificare se il back-end rifiuta azioni proibite.
  • Quando il frontend esegue il test successivo, chiamerà nuovamente l'API speciale. Rails eliminerà lo stato prodotto dal test precedente e ne installerà uno nuovo, per questo test specifico.

Sono un frontend dev con una conoscenza abbozzata di Rails. Factory Girl e Database Cleaner sembrano essere gli strumenti giusti per il lavoro, ma non ci sono assolutamente informazioni su come usarli al di fuori del normale ambiente di test di Rails. Credo di aver bisogno di un controller o di un motore Rails o qualcosa del genere.

Quindi la domanda è: come faccio a fare un'API in Rails, che può essere utilizzato da frontend per dire Rails per impostare un certo stato di database con una fabbrica apparecchio, mentre Rails sono in esecuzione in un non-test modalità i. e. serve API REST e non funziona attraverso RSpec/Capybara/Cucumber?

Funzione bonus: le proprietà della fabbrica di fissaggi devono essere definite sul frontend in modo che il codice di prova sia memorizzato in un'unica posizione. Pertanto, il back-end dovrebbe essere in grado di accettare le proprietà della fabbrica di apparecchiature tramite l'API speciale. I valori predefiniti possono ancora essere definiti nella base di codice del back-end.

Credo che questo potrebbe diventare una best practice di test di accettazione/integrazione. Se riesco a implementarlo, prometto di pubblicare una gemma.

+0

Forse non quello che si desidera ascoltare, ma non ho avuto terribili difficoltà nel testare complesse ember + rail con capibara (prima della suite di test di ember). README di ember-cli-rails dice che "test end-to-end con framework come Cucumber dovrebbero funzionare" (indicando che non sono solo). Vorrei che ci fosse un modo semplice per chiedere a "Ember" pronto? per varie operazioni. Hai pensato di affrontarlo da quell'angolo? Se si vuole fare questo, sono d'accordo, usare FactoryGirl + DB Cleaner e magari costruire un'app sinatra che i test POST a controllarli. Assicurati che funzioni solo in Test. – tgf

+0

Ho fatto una ricerca su Capybara e ho scoperto che si tratta di un mondo di hack e soluzioni peggiori. Inoltre, non voglio tenere i test in un repository diverso da quello che controllano. –

+0

Interessante idea di utilizzare l'API per il test, non vedo la domanda esatta a cui rispondere. – faron

risposta

1

può essere qualcosa di simile

config/routes.rb

namespace 'test_api' do 
    resource 'db_transaction', only: [:create, :destroy] 
end if Rails.env.test? 

controllori/test_api/db_transactions_controller.rb

require 'database_cleaner' 
def create 
    DatabaseCleaner.start 
end 

def destroy 
    DatabaseCleaner.clean 
end 
Problemi correlati