【问题标题】:requirejs throws a 404 trying to load a file from karma runnerrequirejs 抛出 404 试图从 karma runner 加载文件
【发布时间】:2014-07-09 23:20:27
【问题描述】:

我正在尝试使用 requirejs 加载测试帮助程序模块,但即使它已经在业力运行开始时作为依赖项加载,它也会失败,我无法弄清楚问题是什么,我总是得到

There is no timestamp for /base/spec/helpers/testHelpers!'

测试运行良好,在其中我需要应用程序的任何模块都没有问题,只有当我特别需要 spec 文件夹中的某些东西时它才会失败。

我已经检查了所有与业力相关的问题,但没有一个适用于这些案例。

我的 karma.conf 文件:

module.exports = function (config) {
  'use strict';

  config.set({
    basePath: '',
    frameworks: ['jasmine', 'requirejs'],
    files: [
      'bootstrapTests.js',
      {
          pattern: 'app/**/*.js',
          included: false
      },
      {
          pattern: 'entities/**/*.js',
          included: false
      },
      {
          pattern: 'config/**/*.js',
          included: false
      },
      {
          pattern: 'libs/**/*.js',
          included: false
      },
      {
          pattern: 'spec/**/*Spec.js',
          included: false
      },
      {
          pattern: 'spec/helpers/**/*.js',
          included: false
      }
    ],
    exclude: [
        'bootstrap.js',
        'bootstrap.built.js'
    ],
    preprocessors: {
        'app/**/*.js': ['coverage'],
        'entities/**/*.js': ['coverage']
    },
    coverageReporter: {
        reporters: [
            {
                type: 'text-summary'
            }
        ]
    },
    reporters: ['progress', 'coverage'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['PhantomJS'],
    singleRun: false
  });
};

我的 bootstrapTests.js 文件:

var tests = [];

for (var file in window.__karma__.files) {
    if (window.__karma__.files.hasOwnProperty(file)) {
        // Add all spec files and helpers
        if (/spec\/.+.js$/.test(file)) {
            tests.push(file);
        }
    }
}

require.config({
    baseUrl: '/base',
    paths: {
        'backbone': 'libs/backbone',
        'marionette': 'libs/backbone.marionette',
        'jquery': 'libs/jquery-2.1.1',
        'json2': 'libs/json2',
        'underscore': 'libs/underscore',
        'twig': 'libs/twig',

        'editor': 'app/editor',
        'widgets': 'app/widgets',
        'menu': 'app/menu',

        'helpers': 'spec/helpers'
    },
    map: {
        '*': {
            'jquery': 'config/jquery/jqueryPrivate'
        },
        'config/jquery/jqueryPrivate': { 'jquery': 'jquery' }
    },
    deps: tests,

    callback: window.__karma__.start
});

所以在我的测试中,

define([
    'app/app',
    'backbone',
    'editor/editorController',
    'editor/editorApp',
], function (
    myApp,
    Backbone,
    editorController
) {
    'use strict';

    describe('editorApp', function () {

    .....

就像一个魅力,但当我尝试时

define([
    'app/common/routerUtilities',
    'backbone',
    'helpers/testHelpers'
], function (
    routerUtilities,
    Backbone,
    testHelpers
) {
    'use strict';

    describe('routerUtilities', function () {
    ...

尝试获取 testHelpers 失败,即使模块已经加载,也总是会出现错误。除了缩短的路径之外,我还尝试以所有可能的方式指定路径:spec/helpers/testHelpers、/base/spec/helpers/testHelpers、/spec/helpers/testHelpers、../../helpers/testHelpers 等...

该文件作为依赖项包含在测试数组中(选中),因此它与我的测试和其他测试设置模块一起加载(使用 console.log 进行检查):

LOG: ['/base/spec/app/appSpec.js',
'/base/spec/app/common/routerUtilitiesSpec.js',
'/base/spec/app/editor/EditorLayoutViewSpec.js',
'/base/spec/app/editor/editorAppSpec.js',
'/base/spec/app/editor/editorControllerSpec.js',
'/base/spec/app/menu/menuControllerSpec.js',
'/base/spec/helpers/envSetup.js',
'/base/spec/helpers/testHelpers.js']

我已经检查了它包含在 window._ karma _.files 中(为简洁起见编辑):

LOG: Object{
 /base/bootstrapTests.js: 'c389a1d36d1c48f2879d434b10fd5a25b6b07758', 
 /base/app/app.js: '7ad39554809146effd20dd1db908fc068f8119ba',
 /base/app/common/routerUtilities.js: '4da0e1d1794cccc727b544cacbc6d672c0d9965a',
 ...
/base/config/marionette/renderer.js: '34a5e729f6133aa13841c5e949307cd437ca331b', 
/base/config/marionette/templateCache.js: '9f1901d4c6f43f5f90dadacb1c4ac179efd14b15', 
 /base/spec/app/appSpec.js: 'e01f4fea3533e25cfcd4f7621e1c1c5559e0eed8', 
/base/spec/app/common/routerUtilitiesSpec.js: 'a06b9793a635633d053142dff24d1ba4427dd365',
/base/spec/app/editor/EditorLayoutViewSpec.js: 'a24c7e8742e38b86d626bd6f3e45baacfa6af5eb', 
/base/spec/app/editor/editorAppSpec.js: '800c0e8e82840ebd0d1af07c3ec4556a24ee0b04', 
/base/spec/app/editor/editorControllerSpec.js: 'd2e259a477da85b6a2f742f5c6c3a4a34b7e340b', 
/base/spec/helpers/envSetup.js: '297aa1e59477d967aa210bece1726e8a372cb630', 
/base/spec/helpers/testHelpers.js: '5266065d344ca69f8f5980db16bf6d131492ebd0'

}

spec/helpers/testHelpers.js的内容是:

define([
    'backbone'
], function (
    Backbone
) {
    'use strict';

    var testHelpers = {
        setupRoutingTest: function () {
            Backbone.history.start();
            Backbone.history.navigate('');
        },
        teardownRoutingTest: function () {
            Backbone.history.navigate('');
            Backbone.history.stop();
        }
    };
    return testHelpers;
});

我的文件夹结构是:

|-app

  |---common

  |---editor

  |---menu

  |---widgets

|-config

  |---jquery

  |---marionette

|-entities

|-features

|-gruntTasks

   |---lib

|-spec

   |---app

      |-----common

      |-----editor

      |-----menu

      |-----widgets

   |---entities

   |---helpers

 |-tmp

【问题讨论】:

    标签: javascript requirejs karma-runner


    【解决方案1】:

    您好,看起来 karma-requirejs 不喜欢将资源加载到 tests 数组中。

    尝试修改代码以排除帮助文件,它可能会有所帮助

    var tests = [];
    
    for (var file in window.__karma__.files) {
        if (window.__karma__.files.hasOwnProperty(file)) {
            // Add all spec files and helpers
            if (/spec\/.+.js$/.test(file)) {
                tests.push(file);
            }
        }
    }
    

    【讨论】:

    • 也许是我,但我不明白你的答案:/ 此代码与问题中bootstrapTests.js 中的代码相同?
    • @glepretre 对不起,我没有说清楚。如果你查看 karma.conf 文件,你会发现测试文件和帮助文件都在 spec 文件夹中。如果将所有文件放入tests 数组中,它们都将被视为测试,可能不会作为测试的依赖项加载。
    【解决方案2】:

    前段时间这让我有点发疯。确保您使用的是 karma-requirejs,而不仅仅是 requirejs。

    https://www.npmjs.org/package/karma-requirejs

    请注意,不要同时加载 requirejs 的生产版本。

    【讨论】:

    • 我正在使用 karma-requirejs。我刚刚将 libs/require.js 添加到 karma.conf 排除部分,以确保我没有使用任何其他版本,但错误仍然存​​在。
    • 您是否尝试过从 globbing 中删除所有规范?然后一一重新添加。我以前用这种方式修复了一些依赖项。
    • 正如 haochang 发布的那样,似乎以后不能需要任何指定为初始依赖项的文件,从测试数组中排除它们就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多