业力错误'没有时间戳'

时间:2013-12-22 19:21:15

标签: requirejs karma-runner

试图让业力与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提供/ base目录下的文件。所以,在服务器上   对文件的请求将在下面提供   http://localhost:9876/base/*。 baseUrl的Require.js配置给出   用相对路径加载的模块的起始上下文。什么时候   为Karma服务器设置此值将需要从头开始   /基础。我们希望测试的baseUrl与文件夹相同   我们在src / main.js中有基本网址,所以相对需要在   来源不需要改变。所以,因为我们希望我们的基本网址是   src /,我们需要写/ base / src。

这至少可以说令人困惑。我应该在main.js文件中有一个指向'/ base'的baseUrl配置吗?

9 个答案:

答案 0 :(得分:22)

注意:这篇文章在2014年1月16日由Karma有效。我不确定该lib的当前状态,也许他们修复了他们奇怪的配置逻辑并添加了有意义的错误消息。如果没有,那么通过修复与Karma相关的配置问题,这篇文章可能非常有用。

错误配置会导致这类错误。您应该将测试使用的所有内容添加到配置文件中的文件pattern

例如:

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 是HTML中唯一的文件included by Karma 其他文件是依赖项 bootstrap.js 中的代码加载。模式顺序非常重要,遗憾的是它远非合乎逻辑:下一个模式不会覆盖前一个模式。因此,如果我将test/**/*.js模式设置为第一个,test/bootstrap.js设置为第二个,则不起作用,因为不会包含引导程序。在这些情况下,Karma会向您发送"empty testsuite"消息,如果您不知道如何配置它,这将毫无用处...

如果您的测试尝试使用您在Karma配置文件中提供的模式未涵盖的文件,那么您将收到"There is no timestamp for xy"错误消息,这与前面提到的{{1}非常相似}}。如果您不了解系统,您将不会有任何线索,意味着什么,或者您需要做些什么来修复它......

配置对象的"empty testsuite"部分用于文件,这些文件已添加到文件模式中以供包含,但您不希望在测试中包含或使用它们。这些可以是例如开发和生产环境的 requirejs 配置文件等......

答案 1 :(得分:19)

对我而言,错误的是设置basePath: 'base'而不是baseUrl: '/base'

baseUrl: '/base' ftw!

答案 2 :(得分:4)

basePath用于标识项目的根目录相对于配置文件(karma.conf.js)。看一下这个例子:https://github.com/karma-runner/karma/blob/v0.8.5/test/client/karma.conf.js

在浏览器中,我也收到有关时间戳的错误,但它不会影响任何内容。测试工作正常。我想它应该是一个警告而不是一个错误: - )

答案 3 :(得分:3)

杰夫说得对,你应该排除你应用的requirejs配置文件,因为"我们不想在我们的测试中真正启动应用程序。 [LINK]"

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

它们都配置路径和依赖项(可以指定相同的路径和依赖项),但前者是为您编写的测试提供requirejs支持。整个requirejs设置与您在应用中使用的requirejs分开。因此,不要包括后者,它会使Karma感到困惑。

上面的链接是一个有效的Karma,带有它的 requirejs演示,请查看。

答案 4 :(得分:2)

尝试在不同来源上发布的所有解决方案后,最后我得到了固定。请在此处查看:Make "no timestamp" error configurable #6

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

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

答案 5 :(得分:1)

在我的karma.conf.js文件中,我只是排除了包含我的require.config函数的文件(在我的情况下恰好是config.js)并且错误消失了。

  exclude: [
    'app/config.js',
    'bower_components/jasmine/**/*.js'
  ],

答案 6 :(得分:1)

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

如果您使用 karma init (如果没有,只是这样做)并对有关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本地路径中发生的事情。

答案 7 :(得分:0)

当有问题的文件确实存在时,也会发生此错误!

因此,请检查以确保您的项目中出现此错误的文件确实存在!

一旦你发现文件是什么,你可以在你的karma.conf.js中使用这样的模式忽略它们,如果事实证明它们的存在在某些情况下应该被忽略:

exclude: [ 'path/to/files/to/ignore/**/*.js' ]

答案 8 :(得分:0)

从@Naruto Sempai的答案中扩展:

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

然后,我修改了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/

业力配置位置:
/Users/ben/some-project/src/test/var/www/project/karma.conf.js

测试RequireJS Config位置:
/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' 
});