Karma错误:“没有时间戳”

54

我正在尝试让Karma与RequireJS配合使用。但是当运行Karma时,我不明白为什么会收到这么多错误信息:

ERROR: 'There is no timestamp for /base/test/mainSpec.js?bust=1387739317116!'
ERROR: 'There is no timestamp for /base/app/main.js?bust=1387739317116!'
ERROR: 'There is no timestamp for /base/bower_components/jquery/jquery.js?bust=1387739317116!'

当我打开检查器中的网络选项卡时,所有文件都显示出来且没有404错误。

我有些困惑,因为karma似乎在寻找一个“基础”目录,但是我的项目中没有“基础”目录。根据karma文档:

Karma会在“/base”目录下提供文件。所以,在服务器上, 文件请求将在 http://localhost:9876/base/* 下提供。baseUrl的Require.js配置提供了相对路径加载模块的起始上下文。在设置此值时,Karma服务器需要从/base开始。我们希望测试的baseUrl与src/main.js中的baseUrl相同,这样源中的相对路径require就不需要更改。所以,由于我们希望我们的baseUrl位于src/,因此我们需要写成/base/src。

这相当令人困惑。我是否应该在main.js文件中有一个指向“/base”的baseUrl配置?

9个回答

26

注意:本文于2014年1月16日由Karma验证有效。我不确定该库的当前状态,也许他们已经修复了他们奇怪的配置逻辑并添加了有意义的错误消息。如果没有,那么这篇文章可能非常有帮助,可以解决与Karma相关的配置问题。

这种类型的错误是由配置错误引起的。您应该将您的测试使用到的一切内容添加到配置文件中的patterns中。

例如:

module.exports = function (config) {
    config.set({
        basePath: './',
        frameworks: ['jasmine', 'requirejs'],
        files: [
            {pattern: 'test/bootstrap.js', included: true},
            {pattern: 'test/**/*.js', included: false},
            {pattern: 'src/**/*.js', included: false},
            {pattern: 'vendor/**/*.js', included: false}
        ],
        exclude: [

        ],
        reporters: ['progress'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true,
        browsers: ['Firefox'],
        captureTimeout: 6000,
        singleRun: false
    });
};
在这个例子中,bootstrap.js是Karma在HTML中唯一被包含的文件,其他文件是依赖项,由bootstrap.js中的代码加载。模式顺序非常重要,很遗憾它远非合乎逻辑:下一个模式不会覆盖前一个模式。因此,如果我将test/**/*.js模式作为第一个模式,将test/bootstrap.js作为第二个模式,它将无法工作,因为不会包括引导程序。在这些情况下,Karma会发送一个"空测试套件"消息,如果你不知道如何配置它,这将是无用的...
如果你的测试尝试使用配置文件中未涵盖的文件,则会收到"There is no timestamp for xy"错误消息,这与之前提到的"empty testsuite"非常相似。如果你不了解系统,你就不会知道它是什么意思,或者你需要做什么来修复它...
配置对象的exclude部分是为了那些已经添加到文件模式中以进行包含,但你不想在测试中包含或使用它们的文件。这些可以是开发和生产环境下的requirejs配置文件等...

22

对我来说,这个错误就是在设置basePath: 'base'时犯了错,而应该设置为baseUrl: '/base'

选择baseUrl: '/base'胜利万岁!


你能否澄清你的描述中 "basePath" 和 "baseUrl" 之间的区别,以及你的上下文是 karma.conf.js 还是 test-main.js - Cody
2
我很高兴 OP 找到了解决他特定问题的方法,但对我来说,正确的解决方案是在我的 require.config.js 文件中分配 _"baseUrl: '/base'_。我正在使用 grunt-karma,它通过 grunt 配置对象中的 configFile: 'karma.conf.js' 使用 karma.config。无论如何,要点是确保在任何地方都将 '/base' 分配给 _baseUrl_,并且一如既往... 拼写错误是敌人! - Naruto Sempai
1
这个解决方案对我很有帮助,我认为应该得到更多的赞。如果你根本没有获得文件,那么这是一个单独的问题,而这个答案确实回答了这个问题! - jasongonzales
这与时间戳错误消息有什么关系呢?-- 据我所知,所有文件都被正确地提供了,但我对每个文件都保留了这个时间戳消息。我的 baseUrl 已经正确配置了。 - BrainSlugs83

4

3

Jeff说得对,你应该将你的应用程序的requirejs配置文件排除在外,因为“我们不想在测试中实际启动应用程序。 [链接]"。

test-main.js配置文件是与你的应用所使用的requirejs配置文件不同的独立文件,在你的情况下可能是config.jsmain.js,具体取决于你在哪里配置requirejs。

它们都配置路径和依赖项(可能指定相同的依赖项),但前者是为你编写的测试提供requirejs支持。这整个requirejs设置是一个独立的设置,与你在应用中使用的requirejs不同。所以不要包含后者,这会使Karma混淆。

上面的链接是Karma和 requirejs演示的工作版本,请查看。


2

在查阅了不同来源发布的所有解决方案之后,我终于解决了问题。这里可以查看:使“no timestamp”错误可配置#6

karma.conf.js文件的问题示例:

client: {
  requireJsShowNoTimestampsError: '^(?!.*(^/base/app/node_modules/))'
}

1

从@Naruto Sempai的回答中扩展:

我通过首先在我的文件中设置basePath属性来解决此问题。这个路径包含所需的../(上一个目录)字符串,直到我的路径位于源/测试文件的根目录。

然后我修改了我的test-main.js文件(包含我的RequireJS配置),并将baseUrl设置为/base

现在,没有时间戳错误。

--

为了说明我的环境和路径配置,这里有一个基本的设置示例:
源文件位置: /Users/ben/some-project/src/main/resources/var/www/project/js/app 测试文件位置: /Users/ben/some-project/src/test/var/www/project/
Karma配置文件位置: /Users/ben/some-project/src/test/var/www/project/karma.conf.js
测试RequireJS配置文件位置: /Users/ben/some-project/src/test/var/www/project/test-main.js
我的karma.conf.js:
module.exports = function (config) {
    config.set({
       basePath: '../../../../' 
    });
}

我希望将我的“根目录”设置为/Users/ben/some-project/src/

我的test-main.js文件:

requirejs.config({
   baseUrl: '/base' 
});

1
在我的 karma.conf.js 文件中,我只是排除了包含我的 require.config 函数的文件(在我的情况下是 config.js),错误就消失了。
  exclude: [
    'app/config.js',
    'bower_components/jasmine/**/*.js'
  ],

1
这个错误也可能是由于所涉及的文件实际上不存在引起的!
因此,请确保您在项目中获取此错误的文件实际存在!
一旦找出了这些文件,如果它们的存在在某些情况下应该被忽略,您可以在 karma.conf.js 中使用以下模式来忽略它们: exclude: [ 'path/to/files/to/ignore/**/*.js' ]

1
不仅“不存在”,而且似乎还区分大小写!在Windows上我没有预料到这一点,我的代码中有大小写错误,这就是问题所在! - John Gardner

1

我在我的项目中遇到了完全相同的错误,我发现调试问题的最佳和最快方法是列出karma已加载的文件。

如果你使用了karma init(如果没有,请执行此操作)并回答YES关于使用RequireJS的问题,那么你可能有一个像这样的文件:

    var tests = [];
    var TEST_REGEXP = /(spec|test)\.js$/i;
    var BASE_URL = '/base/build/js';
    var BASE_URL_REGEXP = /^\/base\/build\/js\/|\.js$/g;

    // Get a list of all the test files to include
    Object.keys(window.__karma__.files).forEach(function (file) {
        console.log(file;) // ADD THIS CONSOLE LOG TO LIST LOADED FILES
        if (TEST_REGEXP.test(file)) {
          var normalizedTestModule = file.replace(BASE_URL_REGEXP, '')
            tests.push(normalizedTestModule)
        }
    })

    require.config({
      // Karma serves files under /base, which is the basePath from your config file
        baseUrl: BASE_URL,
        paths: {

        },
        shim: {

        },

        deps: tests,

      // we have to kickoff jasmine, as it is asynchronous
      callback: window.__karma__.start
    })

然后,您可以使用您的 karam.conf.js 文件进行操作,并加载新文件以检查karma本地路径中发生了什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接