2013-01-10 18 views
7

Sto scrivendo un'applicazione JavaScript a pagina singola utilizzando Backbone e Backbone.Marionette. Sto usando i moduli AMD e RequireJS per aiutare a organizzare il mio codice e gestire le dipendenze. Sto anche usando Mocha come framework di test per TDD/BDD.Come evitare di introdurre perdite globali quando si utilizza Squire.js con RequireJS e Mocha?

Tutto funzionava bene fino a quando non volevo introdurre matrici, mock e spie usando Sinon.JS. Dopo un sacco di ricerche, mi sono imbattuto in una pagina su test frameworks in the RequireJS wiki e Squire.js, che sembrava fosse adatta alle mie esigenze. Tuttavia, quando provo a utilizzare Squire.js per caricare un modulo, Mocha segnala improvvisamente perdite globali per le dipendenze del modulo. Non ci sono perdite segnalate se carico il modulo direttamente usando Require.JS.

Ad esempio, il seguente codice di prova non causa Mocha per segnalare eventuali perdite:

define(['app/app'], function(app) { 
    describe('App', function() { 
     it('Should define a \'header\' region', function() { 
      expect(app.headerRegion).to.exist; 
     }); 

     it('Should define a \'main\' region', function() { 
      expect(app.mainRegion).to.exist; 
     }); 
    }); 

    return { 
     name: "App" 
    }; 
}); 

Tuttavia, convertendo il codice per utilizzare Squire.js come segue provoca Mocha segnalare perdite per jQuery, spina dorsale, e Marionette (dipendenze di app.js):

define(['Squire'], function(Squire) { 
    describe('App', function() { 

     var testContext = {}; 

     beforeEach(function(done) { 
      testContext.injector = new Squire(); 
      testContext.injector.require(['app/app'], function(app) { 
       testContext.app = app; 
       done(); 
      }); 
     }); 

     it('Should define a \'header\' region', function() { 
      expect(testContext.app.headerRegion).to.exist; 
     }); 

     it('Should define a \'main\' region', function() { 
      expect(testContext.app.mainRegion).to.exist; 
     }); 
    }); 

    return { 
     name: "App" 
    }; 
}); 

che cosa sto facendo di sbagliato? Sono totalmente sconcertato dal fatto che Mocha non segnala una perdita con RequireJS ma fa con Squire.js. Ho anche provato alcune delle altre soluzioni che ho trovato in un altro StackOverflow question on mocking RequireJS dependencies, come la funzione personalizzata e testr.js, prima di Squire.js e aveva risultati simili. Ad oggi, non sono riuscito a trovare un esempio che utilizzi Mocha, RequireJS e Sinon.JS tutti insieme.

Ho placed my current code base on GitHub nel caso in cui ci siano alcune informazioni critiche che ho lasciato fuori o qualcosa del genere. Il test in questione può essere trovato in test\spec\test.app.js.

Qualsiasi assistenza è molto apprezzata. Mi piacerebbe molto andare oltre la monkeying con la mia configurazione di test e su per lavorare effettivamente sulla mia app. Grazie in anticipo.

risposta

5

Dopo aver riflettuto su ciò, mi sono reso conto che questo è in realtà un comportamento previsto e un effetto collaterale del momento in cui è stato caricato app.js per il test.

miei test vengono caricati tramite RequireJS in un comunicato require illustrato di seguito

require([ 
    'spec/test.smoketest', 
    'spec/test.app' 
    ], runMocha); 

dove runMocha è semplicemente una funzione che chiama semplicemente mocha.run().

Mi è venuto in mente che il modo in cui Mocha rileva più probabilmente le perdite globali consiste nel confrontare ciò che viene registrato globalmente prima e dopo l'esecuzione di ciascun test. Nel primo esempio sopra, dove non vengono segnalate perdite, jQuery, Backbone e Marionette vengono caricati da RequireJS prima che mocha.run() venga chiamato come parte del caricamento del modulo test.app.js. D'altra parte, jQuery, Backbone e Marionette vengono caricati come parte dei test stessi nel secondo esempio.

Pertanto, la prima configurazione non segnala eventuali perdite perché jQuery, spina dorsale, e Marionette sono già registrati globalmente primamocha.run() è chiamato. La seconda configurazione segnala perdite perché sono registrate durante i test.

Ora che ho capito cosa sta succedendo e che ciò è previsto, mi sento a mio agio nel configurare Mocha per consentire questi oggetti globali.Questo può essere fatto nella configurazione di Mocha come mostrato di seguito:

mocha.setup({ 
    ui: "bdd", 
    globals:["_", "$", "jQuery", "Backbone", "Marionette"] 
}); 
Problemi correlati