2013-05-13 10 views
5

Mam zestaw obiektów, które są używane po stronie przeglądarki, ale testowane po stronie serwera z mokka. Używam require.js do ładowania AMD. Witryna Require.js proponuje zastosowanie amdefine po stronie serwera, aby uzyskać określone moduły do ​​pracy w node.js z tego kawałka kodu:czy można ustawić amdefine w testach, aby nie musiałem go definiować we wszystkich moich plikach modułów?

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

OK. Ale muszę umieścić to w każdym module, który chcę użyć w węźle. W moim przypadku oznacza to, że muszę go usunąć z dowolnego kodu, który używam po stronie klienta (większość).

Zastanawiam się, czy jest jakiś sposób na umieszczenie tego fragmentu kodu w moim teście, a więc nie muszę go umieszczać w moim kodzie strony klienta. Wydaje się głupio mieć kod w moich plikach, który będzie potrzebny tylko do testów - bardziej sensowne jest umieszczenie go w kodzie testowym. Jednak, gdy to zrobić pojawia się błąd:

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) 

To dziwne błąd, ponieważ kod amdefine jest tylko w jednym miejscu - w górnej części pliku testowego. Czy istnieje sposób na umieszczenie tego kodu amdefine w moim teście i tylko na moim teście i nadal otrzymuję testy do uruchomienia po stronie serwera - bez konieczności usuwania kodu amdefine po stronie klienta?

Odpowiedz

2

Jeśli używasz amd-loader, można to zrobić:

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

to wszystko. Najpierw potrzebujesz amd-loader, a potem możesz ładować moduły w stylu AMD. (W powyższym przykładzie dwa moduły załadowane po amd-loader to moduły w stylu AMD.) Moduły w stylu AMD mogą ładować inne moduły w stylu AMD.

Powyższy fragment kodu jest rzeczywistym kodem z one of my test suites, który testuje bibliotekę zaprojektowaną w stylu AMD, aby można było załadować RequireJS, ale została przetestowana w pliku Node.js.

+0

To bardzo interesujące. Spojrzę na to. Dziękuję za odpowiedź na pytanie, które jest równie zakurzone jak ten. – jcollum

+0

Uznałem, że ktoś może skorzystać. – Louis

+0

https://github.com/ajaxorg/node-amd-loader czy to prawda? – jcollum

Powiązane problemy