使用 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 文件并解决了问题。