Jasmine 的 Karma 测试 运行 找不到 TypeScript 模块
Karma test run with Jasmine cannot find TypeScript module
我想测试我的 TypeScript code with Jasmine executed by Karma。
不幸的是,Karma 无法找到我的模块并且与 "Module name has not been loaded yet for context" 一起存在。
我的 TypeScript class 是这样的:
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]);
这是我的测试文件:
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);
});
});
执行测试时,我收到以下响应:
Uncaught Error: Module name "../../../src/ts/Greeter/Greeter" has not
been loaded yet for context.
这是我的编译器配置:
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"
]
}
我应该如何在我的测试规范中声明我的导入以使编译版本找到我的模块?
我不熟悉 TypeScript,但是当我查看生成的 JavaScript 代码时,我发现 不能 与 RequireJS 一起工作的代码。您收到错误的原因是 GreeterSpec.js
:
中的这段代码
"use strict";
///<reference path="../../../typings/index.d.ts"/>
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
这行不通,因为采用单个参数 的 require
形式必须 出现在 define
中才能安全执行:
define(function (require) {
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
我还看到 Greeter.js
没有调用 define
所以 RequireJS 在解析 require("../../../src/ts/Greeter/Greeter")
时会遇到问题。 (一般来说,你的 RequireJS 配置中的 shim
可能 有帮助,但我认为你有特定的代码 a)它不会帮助 b)没有必要。)
我在你的编译配置中看到你有 "module": "commonjs"
。有问题的代码实际上是好的 CommonJS 代码。然而,RequireJS 想要加载 AMD 模块,我 see "module": "amd"
是一个可能的值,所以我会切换到这个。
我对 post 犹豫不决,因为我不使用 TypeScript,但文件 test/js/GreeterSpec.js 不应该包含 src/ts/Greeter/...
"use strict";
///<reference path="../../../typings/index.d.ts"/>
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
改为src/js/Greeter/...
,如:
"use strict";
///<reference path="../../../typings/index.d.ts"/>
var Greeter_1 = require("../../../src/js/Greeter/Greeter");
换句话说,当您真正想要 JavaScript.
时,您似乎在调用 TypeScript
我想测试我的 TypeScript code with Jasmine executed by Karma。
不幸的是,Karma 无法找到我的模块并且与 "Module name has not been loaded yet for context" 一起存在。
我的 TypeScript class 是这样的:
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]);
这是我的测试文件:
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);
});
});
执行测试时,我收到以下响应:
Uncaught Error: Module name "../../../src/ts/Greeter/Greeter" has not been loaded yet for context.
这是我的编译器配置:
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"
]
}
我应该如何在我的测试规范中声明我的导入以使编译版本找到我的模块?
我不熟悉 TypeScript,但是当我查看生成的 JavaScript 代码时,我发现 不能 与 RequireJS 一起工作的代码。您收到错误的原因是 GreeterSpec.js
:
"use strict";
///<reference path="../../../typings/index.d.ts"/>
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
这行不通,因为采用单个参数 的 require
形式必须 出现在 define
中才能安全执行:
define(function (require) {
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
我还看到 Greeter.js
没有调用 define
所以 RequireJS 在解析 require("../../../src/ts/Greeter/Greeter")
时会遇到问题。 (一般来说,你的 RequireJS 配置中的 shim
可能 有帮助,但我认为你有特定的代码 a)它不会帮助 b)没有必要。)
我在你的编译配置中看到你有 "module": "commonjs"
。有问题的代码实际上是好的 CommonJS 代码。然而,RequireJS 想要加载 AMD 模块,我 see "module": "amd"
是一个可能的值,所以我会切换到这个。
我对 post 犹豫不决,因为我不使用 TypeScript,但文件 test/js/GreeterSpec.js 不应该包含 src/ts/Greeter/...
"use strict";
///<reference path="../../../typings/index.d.ts"/>
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
改为src/js/Greeter/...
,如:
"use strict";
///<reference path="../../../typings/index.d.ts"/>
var Greeter_1 = require("../../../src/js/Greeter/Greeter");
换句话说,当您真正想要 JavaScript.
时,您似乎在调用 TypeScript