Jasmine测试不在编译的Typescript中的define中启动的情况

时间:2017-09-27 00:19:45

标签: javascript typescript jasmine karma-jasmine

我正在使用一个测试项目,我正在编写一个纯Javascript Jasmine Karma设置来测试预编译的Typescript设置。但是,我无法启动测试用例。

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

请注意,这是来自AngularApp,但整个部分来自一个没有Angular2的部分。

没有错误消息,除此之外显示0/0测试已运行,且#34; component / to / test"没有时间戳。

在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
})

注释和一些不相关的代码被删除了空间。

2 个答案:

答案 0 :(得分:1)

您不应该使用tsc编译规范文件,然后在js文件上运行karma。

你应该用打字稿加载器设置业力, 这是一个你应该尝试使用配置示例的包:

documentation

如果这是角度v2 +项目,你肯定是 应该使用@ angular / cli

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

它由有角度的团队支持,并为您提供了许多奇特的东西,例如:

  • prod build
  • aot build
  • 简易通用设置
  • 业力和量角器配置等。

答案 1 :(得分: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中为define提供的硬编码myTs.js名称可能正常。我仍然不建议在那里使用硬编码名称。你说:

  

“component / to / test”

没有时间戳

如果您指的是一个Karma时间戳,那么就没有任何一个,因为您没有具有该名称的文件。