使用Chutzpah对Typescript源文件运行Typescript QUnit测试



我正在尝试为Typescript源文件编写一个带有单元测试的Typescript文件。我的项目结构:

/js/my-unit.ts
/js-tests/my-unit.tests.ts
/Scripts/typings/qunit/qunit.d.ts
/chutzpah.json

以下是my-unit.ts的内容:

function globalFunc() { return { dummy: "object" }; }

以下是my-unit.tests.ts的内容:

/// <reference path="../scripts/typings/qunit/qunit.d.ts" />
/// <reference path="../js/my-unit.ts" />
QUnit.test("Test 1", assert => assert.ok(!!globalFunc()));

这是chutzpah.json文件:

{
    "Compile": {
        "Mode": "External",
        "Extensions": [ ".ts" ],
        "ExtensionsWithNoOutput": [ ".d.ts" ]
    },
    "Tests": [
        { "Includes": [ "**/*-tests/**.ts" ] }
    ]
}

测试是红色的,因为:

找不到变量:globalFunc

为什么我该怎么解决


我试过什么:

  • 在我的测试文件中引用.js文件,但这是不允许的
  • 寻找受骗者,主要找到这个问题,但一个答案不起作用,另一个(Chutzpah的作者,同样如此)似乎与我自己的设置相似
  • 重读"使用Typescript运行单元测试"文档
  • reference更改为源路径(有斜杠结尾和没有斜杠结尾),但这在Visual Studio中给我带来了错误
  • 在单元文件和assert.ok(!!new Foo())测试中添加class Foo {},但这也失败
  • 在单元文件和assert.ok(!!new My.Foo())测试中添加module My { export class Foo { } },但这也失败
  • 使用另一个Chutzpah扩展的"在浏览器中打开"功能,检查测试文件的源(可能也是从测试资源管理器运行时为测试生成的),在那里我看到我的源文件(my-unit.tsmy-unit.js)确实是而不是引用的:

      <!DOCTYPE html>
      <html>
      <head>
          <meta charset="utf-8" />
          <title>QUnit Tests</title>
          <link rel="stylesheet" type="text/css" href="file:///E:/path/to/TestFiles/QUnit/qunit.css"/>
          <script type="text/javascript" src="file:///E:/path/to/TestFiles/QUnit/qunit.js"></script>
          <script type="text/javascript" src="file:///E:/path/to/project/js-tests/my-unit.tests.js"></script>
          <script>
              var amdTestPaths = [];
              // code ommitted for brevity...
          </script>
      </head>
      <body>    
          <div id="qunit"></div>
          <div id="qunit-fixture"></div>
      </body>
      </html>
    
  • 添加

    "References": [{ "Path":  "js", "Includes": [ "**.ts" ], "Excludes": [ "**.d.ts" ] }
    

    到我的chutzpah.json文件。这种方法有效,但相当暴力,因为现在所有我的源文件都将包含在每个测试夹具中。。。


以上是(希望)对我的实际场景的一个最小的重复。我怎样才能让它工作?

TL;DR版本

经过更多的搜索,我发现将ExpandReferenceComments设置为true可以修复以下问题:

"Tests": [
    {
        "ExpandReferenceComments":  true,
        "Includes": [ "**/js-tests/**.ts" ]
    }
]

它在这里进行了解释,并将确保在Chutzpah生成的测试文件中将///注释扩展为<script>标记。


完整解决方案

以下是最低限度的可重复操作的所有文件:

/chutzpah.json

{
    "Compile": {
        "Mode": "External",
        "Extensions": [ ".ts" ],
        "ExtensionsWithNoOutput": [ ".d.ts" ]
    },
    "Tests": [
        {
            "ExpandReferenceComments":  true,
            "Includes": [ "**/js-tests/**.ts" ]
        }
    ]
}

/js/my-unit1.ts

function globalFunc1() { return { dummy: "object 1" }; }

/js/my-unit2.ts

function globalFunc2() { return { dummy: "object 2" }; }

/js-tests/my-unit1.tests.ts

/// <reference path="../scripts/typings/qunit/qunit.d.ts" />
/// <reference path="../js/my-unit1.ts" />
QUnit.test("globalFunc1 works", assert => assert.ok(!!globalFunc1()));

/js-tests/my-unit2.tests.ts

/// <reference path="../scripts/typings/qunit/qunit.d.ts" />
/// <reference path="../js/my-unit2.ts" />
QUnit.test("globalFunc2 works", assert => assert.ok(!!globalFunc2()));

脚注

我不确定为什么ExpandReferenceComments的默认值是false,或者什么时候会有用(也许当Comple Mode不是External时?)。

";完全解决方案";上面包括两个单元和的两个测试文件,因为我想验证每个测试文件的引用是否扩展了,它做到了(如果你在浏览器中运行它们,你会看到Chutpah只为该夹具生成<script>标记)。

最新更新