使用Jasmine的Karma测试运行找不到TypeScript模块

时间:2016-06-03 14:23:48

标签: typescript requirejs jasmine karma-runner commonjs

我希望使用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"
  ]
}

如何在我的测试规范中声明我的导入以使编译版本找到我的模块?

2 个答案:

答案 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。