2016-06-03 12 views
1

Ich möchte meinen TypeScript Code mit Jasmine von Karma ausgeführt testen.Karma-Testlauf mit Jasmine kann kein TypScript-Modul finden

Leider kann das Karma mein Modul nicht finden und existiert mit "Modulname wurde noch nicht für den Kontext geladen".

Meine Typoskript Klasse ist dies:

src/ts/Greeter.ts

export default class Greeter { 
    name:string; 

    constructor(message:string) { 
    this.name = message; 
    } 

    greet() { 
    return "Hi " + this.name; 
    } 
} 

dest/js/Greeter.js

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ 
"use strict"; 
var Greeter = (function() { 
    function Greeter(message) { 
     this.name = message; 
    } 
    Greeter.prototype.greet = function() { 
     return "Hi " + this.name; 
    }; 
    return Greeter; 
}()); 
Object.defineProperty(exports, "__esModule", { value: true }); 
exports.default = Greeter; 

},{}]},{},[1]); 

Und hier ist mein Testdatei:

Test/ts/GreeterSpec.ts

///<reference path="../../../typings/index.d.ts"/> 
import Greeter from "../../../src/ts/Greeter/Greeter"; 

describe('Greeter', function() { 
    it('says Hi', function() { 
    var name = 'Joe'; 
    var greeter = new Greeter(name); 
    expect(greeter.greet()).toBe('Hi ' + name); 
    }); 
}); 

Test/js/GreeterSpec.js

"use strict"; 
///<reference path="../../../typings/index.d.ts"/> 
var Greeter_1 = require("../../../src/ts/Greeter/Greeter"); 
describe('Greeter', function() { 
    it('says Hi', function() { 
    var name = 'Joe'; 
    var greeter = new Greeter_1.default(name); 
    expect(greeter.greet()).toBe('Hi ' + name); 
    }); 
}); 

Wenn mein Test ausgeführt wird, erhalte ich diese Antwort:

Uncaught Error: Module name "../../../src/ts/Greeter/Greeter" has not been loaded yet for context.

Dies ist meine Compilerkonfiguration:

tsconfig.json

{ 
    "compilerOptions": { 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "module": "commonjs", 
    "moduleResolution": "node", 
    "noEmitOnError": true, 
    "noImplicitAny": true, 
    "removeComments": false, 
    "sortOutput": true, 
    "sourceMap": true, 
    "target": "es5" 
    }, 
    "exclude": [ 
    "node_modules", 
    "typings/main", 
    "typings/main.d.ts" 
    ] 
} 

Wie soll ich meine Import in meinem Test-Spezifikation deklarieren die kompilierte Version zu finden, mein Modul zu machen?

Antwort

1

Ich zögere, dies zu schreiben, da ich nicht Typoskript verwenden, sollte aber nicht die Datei Test/js/GreeterSpec.js, wo Sie die src/ts/Greeter/...

"use strict"; 
///<reference path="../../../typings/index.d.ts"/> 
var Greeter_1 = require("../../../src/ts/Greeter/Greeter"); 

statt src/js/Greeter/... sein, wie in:

"use strict"; 
///<reference path="../../../typings/index.d.ts"/> 
var Greeter_1 = require("../../../src/js/Greeter/Greeter"); 

Mit anderen Worten, es sieht so aus, als ob Sie das TypeScript aufrufen, wenn Sie wirklich das JavaScript wollen.

+0

Guter Fang! Sieht so aus, als ob die TypScript-Kompilierung meiner Testdateien dies vermasselt! Ich schaue mir das an und ändere es zu dem, was benötigt wird. Vielen Dank. :) –

+0

Gut zu hören :) –

1

Ich bin nicht vertraut mit TypeScript, aber wenn ich mir den generierten JavaScript-Code anschaue, sehe ich Code, kann nicht arbeiten mit RequireJS. Der Grund, warum Sie den Fehler bekommen Sie bekommen, weil dieser Code in GreeterSpec.js:

"use strict"; 
///<reference path="../../../typings/index.d.ts"/> 
var Greeter_1 = require("../../../src/ts/Greeter/Greeter"); 

Dies kann nicht funktionieren, weil die Form der require, die einen einzelnen Parameter Muss nimmt in einem define erscheinen, sicher sein auszuführen :

define(function (require) { 
    var Greeter_1 = require("../../../src/ts/Greeter/Greeter"); 

ich sehe auch, dass Greeter.js nicht define so haben RequireJS ein Problem require("../../../src/ts/Greeter/Greeter") Lösung nicht nennen. (In der Regel ein shim in Ihrer RequireJS Konfiguration könnte helfen, aber ich denke, mit dem spezifischen Code haben Sie es a) es nicht helfen würde, und b) es ist nicht erforderlich.)

ich in Ihrer Zusammenstellung Konfiguration sehen Sie "module": "commonjs". Der problematische Code ist in der Tat ein guter CommonJS-Code. RequireJS möchte jedoch AMD-Module laden, und ich see, dass "module": "amd" ist ein möglicher Wert, also würde ich zu diesem wechseln.