2013-05-13 7 views
5

Ho un set di oggetti che vengono utilizzati lato browser ma testati lato server con moka. Sto usando require.js per il caricamento di AMD. Il sito suggerisce di utilizzare Require.js amdefine sul lato server per ottenere i moduli definiti di lavorare in node.js con questo pezzo di codice:è possibile impostare amdefine nei test in modo che non debba definirlo in tutti i miei file di modulo?

if (typeof define !== 'function') { 
    var define = require('amdefine')(module) 
} 

OK. Ma devo inserirlo in ogni modulo che voglio usare nel Nodo. Nel mio caso ciò significa che devo toglierlo da qualsiasi codice che sto usando lato client (la maggior parte).

Mi chiedo se ci sia un modo per mettere quel pezzo di codice nel mio test invece in modo che non devo metterlo nel mio codice lato client. Sembra stupido avere il codice nei miei file che sarà necessario solo per i test - ha più senso inserirlo nel codice di test. Tuttavia, quando faccio che ottengo un errore:

Error: amdefine with no module ID cannot be called more than once per file. 
    at runFactory (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:159:23) 
    at define (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:275:13) 
    at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:4:3) 
    at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:158:4) 
    at Module._compile (module.js:456:26) 
    at Object.loadFile (/usr/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:179:19) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Module.require (module.js:364:17) 
    at require (module.js:380:17) 

Si tratta di un errore strano, dato che il codice amdefine è soltanto in un unico luogo - la parte superiore del file di test. C'è un modo per inserire questo codice amdefine nel mio test e solo il mio test e ottenere comunque i test per eseguire il lato server - senza dover togliere il codice amdefine dal lato client?

risposta

2

Se si utilizza amd-loader, si può fare questo:

require("amd-loader"); 
var datatypes = require("../build/dist/lib/salve/datatypes"); 
var name_resolver = require("../build/dist/lib/salve/name_resolver"); 

Questo è tutto. Per prima cosa è sufficiente utilizzare amd-loader e quindi caricare a piacere moduli AMD. (Nell'esempio sopra i due moduli caricati dopo amd-loader sono moduli in stile AMD.) E i moduli in stile AMD possono caricare altri moduli in stile AMD.

Il frammento di cui sopra è il codice effettivo da one of my test suites che verifica una libreria creata AMD-stile in modo che possa essere caricato con RequireJS ma viene sottoposto a Node.js.

+0

È molto interessante. Darò un'occhiata. Grazie per aver risposto a una domanda così polverosa come questa. – jcollum

+0

Ho pensato che qualcuno potrebbe beneficiare. – Louis

+0

https://github.com/ajaxorg/node-amd-loader è quello giusto? – jcollum

Problemi correlati