2014-01-11 9 views
7

Zum Beispiel hat dieses test-main.js und dieses main.js Pfade und Shims dupliziert. Für große Projekte kann es viele von ihnen geben. Ich kann sogar grunt-bower-requirejs plugin verwenden, um installierte bower Komponenten in main.js hinzuzufügen, aber danach muss ich sie in test-main.js kopieren, entweder von Hand oder per Programm.Karma und RequireJS: Vermeidung von Doppelarbeit in src und Test RequireJS Config

Gibt es eine bequeme Möglichkeit, diese Duplizierung zu vermeiden, z. B. RequireJS eine weitere Konfigurationsdatei hinzufügen?

Antwort

5

Ich hasse es auch, Informationen zu duplizieren. Ich arbeite dieses Problem aus, indem ich in meiner Testsuite ein HTML-Setup verwende, das zweimal require.config aufruft.

So HTML in meinem Test-Suite lädt zunächst RequireJS, und dann wird die allgemeine Konfiguration, die in einer Datei namens requirejs-config.js ist:

<script type="text/javascript" src="lib/requirejs/require.js"></script> 
<script type="text/javascript" src="requirejs-config.js"></script> 

Die requirejs-config.js Datei ist nichts Besonderes. Hier ist eine gekürzte Version:

require.config({ 
baseUrl: 'lib/', 
paths: { 
    browser_test: '../../../browser_test', 
    jquery: 'external/jquery-1.10.2', 
    bootstrap: 'external/bootstrap/js/bootstrap.min', 
    // [...] 
}, 
packages: [ 
    { 
     name: "lodash", 
     location: "external/lodash" 
    } 
], 
shim: { 
    bootstrap: { 
    deps: ["jquery"], 
    exports: "jQuery.fn.popover", 
    }, 
    // [...] 
}, 
config: { 
    // [...] 
}, 
enforceDefine: true 
}); 

Dann gibt es ein <script> Element, das require.config mit den Einstellungen aufruft, die auf die Testumgebung gelten: (. Die 'mocha/mocha' Shim sieht komisch aus, aber es ist richtig)

<script> 
    require.config({ 
     paths: { 
      'mocha': '/node_modules/mocha', 
      'chai': '/node_modules/chai/chai' 
     }, 
     shim: { 
      'mocha/mocha': { 
       exports: "mocha", 
       init: function() { this.mocha.setup('bdd'); return this.mocha; } 
      } 
     }, 
     config: { 
     // [...] 
     } 
    }); 
</script> 

In diesem speziellen Fall, der zweite Aufruf von require.config fügt nur neue Werte zu paths, shim und config aber es ist ein Auch möglich übersteuern frühere Werte. Ich könnte zum Beispiel den Pfad ändern, auf den 'jquery' Bootstrap Shim auflöst oder ändert.

Sie können sehen, dass ich Mocha + Chai für meine Testsuite verwende, aber die obige Lösung ist wirklich nicht spezifisch für Mocha.

+2

Großartige Idee. Ich habe einfach ignoriert, dass 'require.config' zweimal aufgerufen werden kann. Ich verwende Karma, also habe ich sowohl app/js/main.js als auch test/unit/test-main.js der Reihe nach hinzugefügt und selektiv 'requires.config' hinzugefügt oder überschrieben. –

+0

Super Lösung @MerlinRan. Danke für den Tipp! – tonyhb

+0

@MerlinRan können Sie ein Beispiel Ihrer Lösung veröffentlichen? – deitch