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

nee*_*ame 7 javascript jasmine typescript karma-jasmine

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

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

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

没有错误消息,除此之外显示0/0测试已运行,并且"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)});
    })
}
Run Code Online (Sandbox Code Playgroud)

在已编译的打字稿文件中,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: { ... }
})
Run Code Online (Sandbox Code Playgroud)

在我的业力档案中

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']
Run Code Online (Sandbox Code Playgroud)

在我的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
})
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*uis 1

你想做的事是可以做到的。我已经做过很多很多次了,没有任何问题。

enforceDefine您应该始终在打开配置选项的情况下运行 RequireJS :

require.config({
  enforceDefine: true,
  // Anything else you need.
});
Run Code Online (Sandbox Code Playgroud)

因为它揭示了可能被忽视的问题。您不希望启用此功能的唯一情况是,如果您能说出enforceDefine对您的具体情况不利的重要原因。

您显示的代码中的一个主要问题是您在define调用中对模块名称进行了硬编码。就像define("testName", ...你不应该这样做。从调用中删除模块名称define。当您要求优化器创建模块包时,优化​​器会添加硬编码的模块名称。在某些情况下,您可能想要对名称进行硬编码,但这种情况很少见,除非您能说出需要硬编码名称的充分且充分的理由,否则不要这样做。

对于测试文件来说,硬编码名称尤其有问题。test-main.js指示 RequireJS 加载您的测试文件。它实际上需要一个名为 之类的模块spec/test.spec。当 RequireJS 实际加载与该模块对应的 JavaScript 文件时,它找到的是名为testName. 因此它找不到该模块,并且由于false 而spec/test.spec默默失败。enforceDefine

鉴于您显示的配置,component/to/test您给出的硬编码名称可能可以正常工作。我仍然不建议在那里使用硬编码名称。你说:definemyTs.js

“组件/要/测试”没有时间戳

如果您指的是 Karma 时间戳,则不可能有任何时间戳,因为您没有具有该名称的文件。