2017-09-27 33 views
7

我正在与一个测试项目,我正在写一个纯Javascript Javascript茉莉花Karma安装程序来测试预编译Typescript设置。但是,我无法启动测试用例。茉莉花测试案例没有启动内定义编译Typescript

我可以看到来自控制台内编译打字机的控制台消息,但它根本不会启动测试脚本。

注意这是来自一个AngularApp,但是这整个部分来自一个部分是在没有Angular2的情况下编译和编译的。

没有错误信息,其中显示0/0测试已运行,并且没有“组件/到/测试”的时间戳。

在test.spec.js文件,我有

define("testName", ["component/to/test"], function(component){ 
    describe("testing module", function(){ 
     it("should work", function(){expect(true).toEqual(true)}); 
    }) 
} 

在编译打字稿文件,myTs.js

var requirejs, require, define; 
(function (global) { 

    define("component/to/test" ["depend", "ences"]), function(depend,ences) 
    { more code here }) 

    some compiled typescript here 
}); 
require.config({ 
    path: {path to javascript libs}, 
    shim: { ... } 
}) 

在我的人缘文件

basePath: '', 
frameworks: ['jasmine', 'requirejs'], 
files: [ 
    'lib1', 
    'lib2', 
    'spec/test-main.js', 
    {pattern: 'js/*.js', included: true, served: true}, 
    {pattern: 'spec/*.spec.js', included: false, served: true} 
], 
exclude: [], 
reporters: ['progress'], 
autoWatch: true, 
browsers: ['Chrome'] 

在我的test-main.js,在我询问我是否想使用requirejs后,从karma init获得。

var allTestFiles = [] 
var TEST_REGEXP = /(spec|test)\.js$/i 

Object.keys(window.__karma__.files).forEach(function (file) { 
if (TEST_REGEXP.test(file)) { 

    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '') 
    allTestFiles.push(normalizedTestModule) 
} 

}) 

require.config({ 
    baseUrl: 'base', 
    deps: allTestFiles, 
    callback: window.__karma__.start 
}) 

评论和一些没有相关的代码被删除的空间。

回答

1

你正在尝试做可以做到的。我做了很多次,没有任何麻烦。

你应该始终运行RequireJS与配置选项enforceDefine接通:

require.config({ 
    enforceDefine: true, 
    // Anything else you need. 
}); 

,因为它揭示了可能会被忽视的问题。唯一一次你不希望这个打开的是,如果你能说出一个重要原因,为什么enforceDefine对你的具体情况不好。

您显示的代码中的一个主要问题是您在define调用中硬编码模块名称。像define("testName", ...你不应该这样做。从define呼叫中删除模块名称。当您要求它创建模块时,优化程序会添加硬编码模块名称。在某些情况下,您可能需要硬编码名称,但这些情况非常罕见,除非您可以命名实质且充分的理由,您需要硬编码名称,否则不要这样做。

对于测试文件,硬编码名称尤其有问题。 test-main.js指示RequireJS加载您的测试文件。它实际上需要一个名为spec/test.spec的模块。当RequireJS实际加载对应于这个模块的JavaScript文件时,它发现的是一个名为testName的模块的定义。所以它找不到spec/test.spec模块,并且它会以静默方式失败,因为enforceDefine为false。

硬编码component/to/test给你的名字definemyTs.js根据你所显示的配置可能工作正常。我仍然不建议在那里使用硬编码名称。你说:

存在的没有时间戳“组件/到/测试”

如果你说的是噶时间戳,则不能有任何因为你没有与该名称的文件。

1

你不应该用tsc编译spec文件,然后通过js文件运行karma。

你应该打字稿装载机安装业力, 这是一个包,你应该配置样本尝试:

https://www.npmjs.com/package/karma-typescript#configuration

如果是角V2 +项目,你绝对 应该使用@角/ CLI

https://github.com/angular/angular-cli

它是由角团队的支持,并为您提供了很多花哨的东西,如:

  • 督促建立
  • AOT建立
  • 容易通用安装
  • 因缘和量角器CONFIGS等