我正在尝试为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.ts
或my-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>
标记)。