使用 Chutzpah 和 ReSharper 的 Jasmine 测试中的 ReferenceError
ReferenceError in Jasmine test using Chutzpah and ReSharper
我正在使用 Jasmine 和 Chutzpah 来测试我在 Visual Studio 2013 年使用 PhantomJS 的 TypeScript 项目。如果我 运行 使用 Chutzpah 上下文菜单扩展的测试,它们工作正常,但是当我 运行 使用 ReSharper 测试资源管理器时,如果有任何外部依赖性,它们会失败。错误信息是 ReferenceError: $ is not defined
.
我的项目结构如下:
- Scripts
- MyApp
- Components
- DatePicker.ts
- Tests
- Components
- DatePickerTest.ts
- typings
- jquery
- jquery.d.ts
- jquery-1.10.2.js
Chutzpah.json
Chutzpah.json
长得像
{
"Framework": "jasmine",
"Compile": {
"Mode": "External",
"Extensions": [ ".ts" ],
"ExtensionsWithNoOutput": [ ".d.ts" ]
},
"References": [
{
"Includes": [
"*/Scripts/jquery-1.10.2.js"
],
"Excludes": [ "*/Scripts/*.d.ts" ]
}
],
"Tests": [
{
"Includes": [ "*/Scripts/Tests/*.ts" ],
"Excludes": [ "*/scripts/Tests/*.d.ts" ]
}
]
}
DatePickerTest.ts
长得像
/// <reference path="../../myapp/components/datepicker.ts" />
import DatePicker = MyApp.Components.DatePicker;
describe("Datepicker", () => {
var datePicker: DatePicker
beforeEach(() => {
datePicker = new DatePicker();
});
// tests
});
实例化 DatePicker
失败并显示消息 ReferenceError: $ is not defined
,因为 class 在构造函数中使用了 $.extend()
。
我尝试通过添加行 /// <chutzpah_reference path="../../jaquery-1.10.2.js" />
在测试顶部声明对 jQuery 的引用,但这没有任何区别。另外我的理解是,在 Chutzpah.json
中添加引用意味着我无论如何都不应该这样做。
按照 this answer 中的建议,我已经在浏览器中调试了我的测试,果然 jQuery 没有被加载到 index.html
页面中,所以我做错了什么?
问题归结为 ReSharper 如何尝试根据它找到的类型定义引用来解决依赖关系。 ReSharper unit testing docs 说:
If your test file references and (sic) external JavaScript library using a declaration file (*.d.ts), ReSharper will search the original JavaScript file by the name of the *.d.ts file.
我的 class 测试中引用了 jQuery 定义文件:
/// <reference path="../../typings/jquery/jquery.d.ts" />
问题是我的项目中也包含了 jquery.cookie.js
(作为 Foundation 的一部分),而 ReSharper 错误地包含了它而不是 jquery-1.10.2.js
。
重命名或删除 jquery.cookie.js
允许 ReSharper 找到正确的 jQuery 文件并解决了问题。
我正在使用 Jasmine 和 Chutzpah 来测试我在 Visual Studio 2013 年使用 PhantomJS 的 TypeScript 项目。如果我 运行 使用 Chutzpah 上下文菜单扩展的测试,它们工作正常,但是当我 运行 使用 ReSharper 测试资源管理器时,如果有任何外部依赖性,它们会失败。错误信息是 ReferenceError: $ is not defined
.
我的项目结构如下:
- Scripts
- MyApp
- Components
- DatePicker.ts
- Tests
- Components
- DatePickerTest.ts
- typings
- jquery
- jquery.d.ts
- jquery-1.10.2.js
Chutzpah.json
Chutzpah.json
长得像
{
"Framework": "jasmine",
"Compile": {
"Mode": "External",
"Extensions": [ ".ts" ],
"ExtensionsWithNoOutput": [ ".d.ts" ]
},
"References": [
{
"Includes": [
"*/Scripts/jquery-1.10.2.js"
],
"Excludes": [ "*/Scripts/*.d.ts" ]
}
],
"Tests": [
{
"Includes": [ "*/Scripts/Tests/*.ts" ],
"Excludes": [ "*/scripts/Tests/*.d.ts" ]
}
]
}
DatePickerTest.ts
长得像
/// <reference path="../../myapp/components/datepicker.ts" />
import DatePicker = MyApp.Components.DatePicker;
describe("Datepicker", () => {
var datePicker: DatePicker
beforeEach(() => {
datePicker = new DatePicker();
});
// tests
});
实例化 DatePicker
失败并显示消息 ReferenceError: $ is not defined
,因为 class 在构造函数中使用了 $.extend()
。
我尝试通过添加行 /// <chutzpah_reference path="../../jaquery-1.10.2.js" />
在测试顶部声明对 jQuery 的引用,但这没有任何区别。另外我的理解是,在 Chutzpah.json
中添加引用意味着我无论如何都不应该这样做。
按照 this answer 中的建议,我已经在浏览器中调试了我的测试,果然 jQuery 没有被加载到 index.html
页面中,所以我做错了什么?
问题归结为 ReSharper 如何尝试根据它找到的类型定义引用来解决依赖关系。 ReSharper unit testing docs 说:
If your test file references and (sic) external JavaScript library using a declaration file (*.d.ts), ReSharper will search the original JavaScript file by the name of the *.d.ts file.
我的 class 测试中引用了 jQuery 定义文件:
/// <reference path="../../typings/jquery/jquery.d.ts" />
问题是我的项目中也包含了 jquery.cookie.js
(作为 Foundation 的一部分),而 ReSharper 错误地包含了它而不是 jquery-1.10.2.js
。
重命名或删除 jquery.cookie.js
允许 ReSharper 找到正确的 jQuery 文件并解决了问题。