RequireJS没有使用karma和typescript正确加载模块

时间:2014-09-17 19:03:18

标签: javascript requirejs typescript jasmine karma-runner

我正在尝试使用karma / jasmine设置SPA的单元测试

首先,以下测试在业力中运行良好:

/// <reference path="../../definitions/jasmine/jasmine.d.ts" />
/// <reference path="../../src/app/domain/core/Collections.ts"/>

define(["app/domain/core/Collections"], (collections) => {

    describe('LinkedList', () => {

        it('should be able to store strings for lookup', () => {
            var list = new collections.Collections.LinkedList<string>();

            list.add("item1");
            expect(list.first()).toBe("item1");
        });
    });
}); 

但是,collections的类型为any,所以我不能将它用于类型声明,因此我在编写测试时缺少intellisense等等。不好!<​​/ p>

当我尝试将测试重新编写为更适合TypeScript的格式时出现问题:

/// <reference path="../../definitions/jasmine/jasmine.d.ts" />
/// <reference path="../../src/app/domain/core/Collections.ts"/>
import c = require("./../../src/app/domain/core/Collections");

describe('LinkedList', () => {

    it('should be able to store strings for lookup', () => {
        var list: c.Collections.LinkedList<string> = new c.Collections.LinkedList<string>();

        list.add("item1");
        expect(list.first()).toBe("item1");
    });
});

这编译得很好,我得到了我的类型信息,方便智能感知等,但现在业力引发了错误。

事实证明它正在尝试加载模块而不是 .js后缀,由以下错误消息指示:

There is no timestamp for /base/src/app/domain/core/Collections! 
Failed to load resource: the server responded with a status of 404 (Not Found)
 (http://localhost:9876/base/src/app/domain/core/Collections)
Uncaught Error: Script error for: /base/src/app/domain/core/Collections

我现在要停在这里,但如果有帮助我很乐意提供我的业力配置文件,test-main等等。但我希望有人之前遇到过这个问题,并且可能能够指出我正确的方向。

我的打字稿是用AMD标志编译的。

2 个答案:

答案 0 :(得分:2)

这不是TypeScript问题。我们遇到了同样的问题。原来是业力&#34;窗口。 __业力__ .files&#34; array包括测试中包含的所有文件,包括.js扩展。

现在,在提供.js扩展名时,requireJS不起作用。为了解决这个问题,我们在 main-test.js 文件中创建了一个变量&#34; tests&#34;通过过滤所有* Spec.js文件,然后我们从文件名删除 .js ,因为requireJS需要它。更多信息请访问:http://karma-runner.github.io/0.8/plus/RequireJS.html

以下是我们如何做到的(基于上面链接中提供的信息):

主test.js

console.log('===========================================')
console.log('=================TEST FILES================')


var tests = Object.keys(window.__karma__.files).filter(function (file) {
    return /\Spec\.js$/.test(file);
}).map(function (file) {
    console.log(file);
    return file.replace(/^\/base\/|\.js$/g, '');
});

console.log('===========================================')
console.log('===========================================')


require.config({
    baseUrl:'/base',
    paths: {
        jquery      :["http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min", "lib/jquery"],
        angular     : ["https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.14/angular.min", "lib/angular"],
        angularMocks: 'app/vendors/bower_components/angular-mocks/angular-mocks',
    },
    shim: {
        'angularMocks': {
            deps: ['angular'],
            exports: 'angular.mock'
        }
    },
    deps: tests,
    callback: window.__karma__.start
});

另外请确保您已在karma.config.js文件中提供了要测试的文件,详情请参阅:http://karma-runner.github.io/0.8/plus/RequireJS.html与上面的链接相同。

希望有所帮助

答案 1 :(得分:0)

  

事实证明它正在尝试加载没有.js后缀的模块,

这可能不是错误的实际来源。实际上它正在查看/base/src/app/domain/core/Collections而不是app/domain/core/Collections(如您的手动类型不安全方式)。请注意base/src/不应该存在。