2017-06-17 6 views
0

Ich verwende TypeScript, Mocha (mit Mocha-Typescript-Plugin) zum Testen und WebPack für Build in meiner Anwendung.Testen: mocha + typescript + webpack

Vor kurzem habe ich mich entschlossen DefinePlugin für WebPack zu trennen configs für prod und dev Umgebungen hinzuzufügen:

import { AppSettings as DevSettings } from './appSettings.dev' 
import { AppSettings as ProdSettings } from './appSettings.prod' 

declare var __ENVIRONMENT__: string; 

let settings = __ENVIRONMENT__ === 'prod' ? ProdSettings : DevSettings 

export let AppSettings = settings; 

In Snippet oben gibt es eine globale Variable __ENVIRONMENT__, die Einstellungen, die ich verwenden möchten wählen können. Diese Variable wird in webpack.config.js wie folgt definiert:

module.exports = function(env) { 
    var config = { 
     // ... 
     plugins: [ 
      new ExtendedDefinePlugin({ 
       __ENVIRONMENT__: env === 'prod' ? 'prod' : 'dev', 
      }) 
     ] 
     // ... 
    } 

    return config; 
} 

Also ich Tests Ausführung in package.json ändern

"test": "webpack --env=dev && mocha --recursive" 

Wenn ich "test", Mokka Wurf Fehler nennen (webpack baut richtig Dateien):

ReferenceError: __ENVIRONMENT__ is not defined 

Testing Beobachter wird auch nicht funktionieren:

"test-watch": "mocha-typescript-watch" 

Wurffehler "Beendet mit 1".

Ist es möglich, sie zusammenzubringen? Oder soll ich einen anderen Weg zum Testen benutzen?

+0

DefinePlugin sollte buchstäblich "__ENVIRONMENT__" durch "prod" oder "dev" in der Build-Ausgabe ersetzen - Sind Sie sicher, dass die Substitution für den Browser funktioniert? – Catalyst

+1

@Catalyst, ja, es ist. Aber es ist nicht die Ursache für diesen Umstand - ich habe einfach keine vollständigen Konzepte von Mokka und Webpack verstanden. – user1820686

Antwort

1

Ok, als ich schließlich bekam ich es auf falsche Weise verwendet.

Es ist mehr richtig Variable einzurichten bezogen auf Knoten in webpack.config.js:

module.exports = function(env) { 
    var config = { 
     // ... 
     plugins: [ 
      new ExtendedDefinePlugin({ 
       'process.env': { 
        'NODE_ENV': env === 'prod' ? 'prod' : 'dev', 
       } 
      }) 
     ] 
     // ... 
    } 

    return config; 
} 

Und es zu benutzen, wann immer notwendig wie:

declare var process: any; 

export let AppSettings = process.env.NODE_ENV === 'prod' ? ProdSettings : DevSettings; 

Deshalb meine Mokka-Tests gut laufen (da Sie werden in Node, nicht im Browser ausgeführt).

+0

Ich verstehe es nicht, was Ihren Code funktioniert. NODE_ENV? als eine Schnur? ist "process.env" etwas, das der Knoten identifizieren kann? – RicardoGonzales

Verwandte Themen