我希望使用TypeScript执行的Jasmine来测试我的Karma代码。
不幸的是,Karma无法找到我的模块并且存在“模块名称尚未加载上下文”。
我的TypeScript类是:
的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]);
这是我的测试文件:
测试/ 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);
});
});
测试/ 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);
});
});
执行测试时,我得到了这个回复:
未捕获错误:模块名称“../../../src/ts/Greeter/Greeter”没有 尚未加载上下文。
这是我的编译器配置:
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"
]
}
如何在我的测试规范中声明我的导入以使编译版本找到我的模块?
答案 0 :(得分:1)
我不熟悉TypeScript,但是当我查看生成的JavaScript代码时,我看到无法使用RequireJS的代码。您收到错误的原因是require
中的此代码:
define
这不起作用,因为define(function (require) {
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
采用单个参数的形式必须出现在Greeter.js
内才能安全执行:
define
我还看到require("../../../src/ts/Greeter/Greeter")
没有调用shim
因此,RequireJS会在解析"module": "commonjs"
时遇到问题。 (一般来说,你的RequireJS配置中的"module": "amd"
可以帮助,但我认为你拥有它的具体代码a)它没有帮助,b)没有必要。)
我在编译配置中看到你有snmpd
。有问题的代码实际上是很好的CommonJS代码。但是,RequireJS想要加载AMD模块,/etc/snmp/snmpd.conf
agentAddress udp:161,udp6:[::1]:161
是一个可能的值,所以我会切换到这个。
答案 1 :(得分:1)
由于我不使用TypeScript,因此我不愿发帖,但不应该使用{{1>} < test / js / GreeterSpec.js 文件/ p>
src/ts/Greeter/...
代替"use strict";
///<reference path="../../../typings/index.d.ts"/>
var Greeter_1 = require("../../../src/ts/Greeter/Greeter");
,如下所示:
src/js/Greeter/...
换句话说,当您真正想要JavaScript时,看起来就是在调用TypeScript。