我正在使用一个测试项目,我正在编写一个纯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
})
注释和一些不相关的代码被删除了空间。
答案 0 :(得分:1)
您不应该使用tsc
编译规范文件,然后在js文件上运行karma。
你应该用打字稿加载器设置业力, 这是一个你应该尝试使用配置示例的包:
如果这是角度v2 +项目,你肯定是 应该使用@ angular / cli
https://www.npmjs.com/package/karma-typescript#configuration
它由有角度的团队支持,并为您提供了许多奇特的东西,例如:
答案 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时间戳,那么就没有任何一个,因为您没有具有该名称的文件。