测试具有包依赖关系的TypeScript模块

时间:2017-06-23 09:37:39

标签: javascript unit-testing typescript webpack chutzpah

我有一个用TypeScript编写的类:

import * as uuid from "uuid";

export class IdGenerator {

  getId() {
    return uuid.v4();  
  }
}

这依赖于我用npm安装的uuid包。

我使用webpack将其与使用TypeScript编写的其他代码一起部署到浏览器中。依赖性得到了解决,一切都很好。

我想测试这个类,所以我编写了以下测试:

import { IdGenerator } from "../src/IdGenerator";

describe("An id generator", () => {

  const idGenerator = new IdGenerator();

  it("generates an id", () => {
    expect(idGenerator.getId()).not.toBeNull();
  });

});

我使用Chutzpah进行以下配置:

{
  "Framework": "jasmine",
  "TestHarnessReferenceMode": "AMD",
  "TestHarnessLocationMode": "SettingsFileAdjacent",
  "EnableTestFileBatching": true,
  "References": [
    {
      "Path": "node_modules/requirejs/require.js",
      "IsTestFrameworkFile": true
    }
  ],
  "Compile": {
    "Mode": "External",
    "Extensions": [ ".ts" ],
    "ExtensionsWithNoOutput": [ ".d.ts" ]
  },
  "Tests": [
    { "Path": "Components/test" }
  ]
}

尝试使用Chutzpah进行测试时,出现以下错误:

  

/node_modules/requirejs/require.js中的未处理异常[...] [...]“uuid”的脚本错误,需要:Components / src / IdGenerator

所以我在chutzpah.json中添加了对路径的引用,它解除了这个错误,但是为uuid的一个依赖项引发了一个错误。我添加了依赖项的引用,然后获得了进一步的依赖项错误,依此类推。

理想情况下,我希望所有依赖项的解析方式与部署到浏览器的bundle一样。

我是否应该放弃尝试以这种方式测试具有包依赖性的TypeScript文件的想法,而是考虑使用依赖注入并模拟测试的TypeScript文件中的包依赖项?也许还为捆绑创建单独的JavaScript测试?或者是否有另一种方法可以使用包依赖性来测试我的TypeScript代码?

1 个答案:

答案 0 :(得分:0)

看起来它不起作用,因为requireJS和Node以这种方式不兼容。见here。从那个答案:

无法在客户端(浏览器)上使用RequireJS访问node_modules. 中的文件node_modules下的文件必须先复制到可访问的位置(在客户端可以访问它们之前的public文件夹下)。文档说RequireJS can access Node modules,但这仅适用于服务器端 JavaScript(当您想在Node中使用RequireJS样式的模块语法时)。

要在客户端应用中使用config模块,您必须先将其转换为与RequireJS兼容的模块,然后将其复制到public下。本文{{3并且包含最终修复了我对RequireJS + Node的理解的引用:

  

要在浏览器上使用节点模块,您需要构建   工具。这可能会打扰你。如果这是一个交易破坏者,那么所有人   意味着继续浪费你的生命复制和粘贴代码和   安排你的脚本标签。