2014-07-03 6 views
9

Sto usando Mocha, Chai, Sinone, Proxyquire e Nock.Come ripetere il test dello stesso URL utilizzando Mocha e Nock?

Per questo particolare scenario di test (per il quale viene posta questa domanda), si desidera testare lo stesso URL più volte, ciascuna in un test separato che si aspetta una risposta diversa.

Ad esempio, una risposta senza feed commerciante, 1 feed commerciante e ancora una volta con 2 feed commerciante.

Il codice esistente funziona tutto, inoltre, se eseguo i test individualmente, passano.

Tuttavia, se li eseguo insieme utilizzando Mocha in una singola suite, falliscono. Credo che il problema sia che Nock dirotta l'oggetto http globale per un dato URL e ogni test (eseguito in modo asincrono allo stesso tempo) è in competizione per lo stesso riferimento di risposta globale.

Nello scenario precedente, una risposta preparata con una risposta preconfezionata di 1 commerciante sta ottenendo dire sovrascritto dal setup di rispondere con 2 commercianti ecc

Esiste un meccanismo per evitare che ciò accada, per esempio garantisce intorno esecuzione seriale di test di Mocha asincroni (che ritenevo fosse il comportamento predefinito).

risposta

7

Ok, quindi questo funziona (codice di esempio):

beforeEach(function (done) { 
      nock(apiUrl) 
       .get('/dfm/api/v1/feeds?all=false') 
       .reply(200, [ 
        {'merchantId': 2, 'id': 2, 'disabled': false} 
       ], { server: 'Apache-Coyote/1.1', 
        'set-cookie': [ 'JSESSIONID=513B77F04A3A3FCA7B0AE1E99B57F237; Path=/dfm/; HttpOnly' ], 
        'content-type': 'application/json;charset=UTF-8', 
        'transfer-encoding': 'chunked', 
        date: 'Thu, 03 Jul 2014 08:46:53 GMT' }); 

      batchProcess = proxyquire('./batchProcess', { 
       './errorHandler': errorHandler.stub, 
       './batchTask': batchTask.stub 
      }); 

      winston.info('single valid feed beforeEach completed'); 
      done(); 
    }); 

c'erano un sacco di fattori di complicazione. Due cose di cui essere a conoscenza:

1). Avevo dei test di prova asincroni ma usavo beforeEach() senza il parametro done. Questo causava quindi la collisione degli URL. Dichiarando esplicitamente ogni beforeOach (done) e invocando done() Mocha verrà eseguito in ordine seriale e non c'è più alcun problema.

2). Assicurarsi che se si dispone di più di un test nello stesso file di testuite, qualsiasi fixing Nock impostato in un test precedente viene effettivamente eseguito SE si è dichiarato lo stesso URL in un test successivo con risposta alternativa. Se il precedente cocca non viene richiamato, allora nocca ANCORA trattiene la risposta dal test sbagliato (quello precedente). Questo era il mio problema principale. Si potrebbe obiettare che i test non dovrebbero avere alcuna fixture dichiarata se non vengono eseguiti - ma si potrebbe anche sostenere che questo è ancora un bug nel modo in cui funziona Nock. I dispositivi di prova sono stati isolati ciascuno nelle proprie funzioni descrittive/prima di (finito).

Aggiornamento 2 giorni dopo ... OK punto 2). mi ha solo morso di nuovo, e sono stato contento di aver scritto la nota sopra per ricordarmi di questo difficile problema di debug. Se stai usando Mocha e Nock insieme, sii consapevole di questo problema !!

fatto finalmente implementare una funzione cocca di supporto anche per aiutare con questo (CoffeeScript qui):

global.resetNock = -> 
    global.nock.cleanAll() 
    global.nock.disableNetConnect() 

Poi all'inizio del beforeeach basta applicare resetNock()

+0

Ciao @arcseldon Complimenti che hai trovato la risposta a questo problema di strappo di capelli. Sono nella stessa situazione https://stackoverflow.com/questions/46801001/nock-not-working-for-multiple-tests-running-together e mi piacerebbe il tuo aiuto, se possibile. – Rash

8

In risposta al punto 2), è possibile utilizzare nock.cleanAll() per ripulire tutte le cocche preparati:

https://github.com/pgte/nock#cleanall

puoi mettere questa in un blocco afterEach per assicurarsi di non avere cocche rimanenti tra i test.

afterEach -> 
    nock.cleanAll() 
+0

Grazie James, lo sto già facendo, per favore vedi la risposta aggiornata. – arcseldon