2013-06-05 6 views
6

Próbuję wymyślić najlepsze podejście do testowania definicję modułu JavaScript używając fabrykę UMD, podobny do tego: https://github.com/umdjs/umd/blob/master/returnExportsGlobal.jsTest Grunt na UMD

Nie chcę przetestować sam moduł, chcę aby przetestować, czy moduł został poprawnie "wyeksportowany/utworzony" w różnych środowiskach:

  1. Jeśli CommonJS (węzeł), czy moduł jest prawidłowo eksportowany?
  2. Jeśli AMD, czy jest zdefiniowany poprawnie?
  3. Jeśli przeglądarka (bez wymaganego oprogramowania), czy utworzono poprawny globalny?

Chciałbym przeprowadzić te testy za pomocą chrząka i jaśminu. Mogę użyć grunt-contrib-jaśmin do testowania dla punktów 2 i 3, ale nie dla punktu 1.

Myślę, że mogę użyć mikstury gruntu-contrib-jaśminu i chrząknięcia-jaśminu-węzła do przetestowania dla właściwego modułu definicje (konkretna implementacja musiałbym jeszcze wymyślić), ale wydaje się bardzo niechlujna.

Czy na wysokim poziomie ktoś wie o istniejących metodach osiągnięcia tego celu bez używania wtyczek wielogłośnych?

Odpowiedz

4

W końcu zdecydowałem się przejść z hybrydowymi zadaniami, używając grunt-contrib-jaśminu do globalnych przeglądarek AMD i przeglądarek AMD oraz jaśminowego trybu testowania CommonJS. Mam tylko jeden plik spec , który obsługuje wszystkie testy typu 3 modułów.

Oto mój grunt config:

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    jasmine: { 
    browserGlobal: { 
     src: ['src/Foo.js'], 
     options: { 
     specs: 'spec/**/*.spec.js' 
     } 
    }, 
    browserAMD: { 
     src: ['src/Foo.js'], 
     options: { 
     specs: 'spec/**/*.spec.js', 
     template: require('grunt-template-jasmine-requirejs') 
     } 
    } 
    }, 
    jasmine_node: { 
    specNameMatcher: 'spec', 
    projectRoot: 'spec/' 
    } 
}); 

Moi jaśminu plików Spec teraz wspierać UMD:

(function (root, factory) { 
    if (typeof module === 'object' && module.exports) { 
    // Node/CommonJS 
    factory(
     require('modulename') 
    ); 
    } else if (typeof define === 'function' && define.amd) { 
    // AMD 
    define([ 
     'modulename' 
    ], factory); 
    } else { 
    // Browser globals 
    factory(root.ModuleName); 
    } 
}(this, function factory(ModuleName) { 

// Tests here 
})); 

A oto fabryka UMD używam dla mojego modułu:

(function (root, factory) { 
    if (typeof module === 'object' && module.exports) { 
    // Node/CommonJS 
    module.exports = factory(); 
    } else if (typeof define === 'function' && define.amd) { 
    // AMD. Register as an anonymous module. 
    define(factory); 
    } else { 
    // Browser globals 
    root.ModuleName = factory(); 
    } 
}(this, function factory() { 


    // public API 
    return { 
    foo: 'bar' 
    }; 
})); 
0

Możesz także użyć uRequire i zapisać swoje dane z wszystkich kart wzorcowych UMD we wszystkich modułach, używając declarative features.

Wystarczy napisać zwykły AMD lub zwykły CommonJS moduły (lub mieszanka dwóch) oraz konwertować do UMD (lub RJS zoptymalizowanej combined.js który działa jak jest na nodejs, Web/AMD & WWW/script) z prostym kodem build step and config, w języku CLI lub grunt.

Produkowane UMD oparte jest na dobrze znanych szablonach, takich jak https://github.com/umdjs/umd/blob/master/returnExportsGlobal.js, z różnymi poprawkami, z których jednym jest declaratively export to window/global.

Następnie możesz przekonwertować zwykłe specyfikacje AMD lub commonJS na UMD i/lub "combined.js" i uderzyć zarówno w przeglądarce, jak i muck. Zobacz uBerscore dla wielu banalnych i bardziej zaawansowanych przykładów.