【问题标题】:RequireJS not loading modules properly using karma and typescriptRequireJS 没有使用业力和打字稿正确加载模块
【发布时间】:2014-09-17 19:03:18
【问题描述】:

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

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

/// <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");
        });
    });
}); 

但是,collectionsany 类型,因此我不能将其用于类型声明,因此在编写测试时我缺少智能感知等。不好!

当我尝试将测试重写为对 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");
    });
});

这编译得很好,我得到了方便的智能感知等的类型信息,但现在 karma 抛出一个错误。

事实证明它正在尝试加载 没有 .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

我现在就到此为止,但如果有帮助的话,我很高兴提供我的 karma 配置文件、test-main 等。但我希望有人以前遇到过这个确切的问题,并且可能能够指出我正确的方向。

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

【问题讨论】:

    标签: javascript requirejs typescript jasmine karma-runner


    【解决方案1】:

    这不是 TypeScript 问题。我们遇到了同样的问题。结果证明 karma "window.__karma__.files" 数组包含测试中包含的所有文件,包括 .js 扩展名。

    现在 requireJS 在提供 .js 扩展名时不起作用。为了解决这个问题,在我们的 ma​​in-test.js 文件中,我们通过过滤所有 *Spec.js 文件创建了一个变量“tests”,然后我们删除 >.js 来自文件名,因为 requireJS 需要它。更多信息在这里:http://karma-runner.github.io/0.8/plus/RequireJS.html

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

    main-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 与上面的链接相同。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      原来它正在尝试加载没有 .js 后缀的模块,

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

      【讨论】:

      • 如果我从 require 调用中取出它,那么 typescript 编译器将找不到该文件。此外,/base/src/app/domain/core/Collections.js 是文件在 karma runner 服务器上的实际位置,即将它放在浏览器中不会生成 404:localhost:9876/base/src/app/domain/core/Collections.js。那么为什么这会导致 require.js 省略文件的 .js 后缀呢?
      猜你喜欢
      • 2016-04-08
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2018-02-04
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多