模块名称__未加载karma和requirejs

时间:2017-06-09 08:54:37

标签: javascript node.js requirejs karma-runner config

我有一些存储库(A,B,C和TestRepo)所有这些都在本地,我得到业力从repos A或B或C加载规范文件与param(节点脚本)。

现在我试图转换文件导致一些测试正在使用import所以我需要babel。我将babel配置为预处理器,它似乎正在工作,但我知道我得到了这个错误:

Uncaught Error: Module name "builder" has not been loaded yet for context: _. Use require([])

我尝试了所有我认识但仍然无效的配置。

我的karma.config.js就是这样:

module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', 'requirejs'],
    files: [
      'test-main.js'
    ],
    exclude: [
    ],
    preprocessors: {
    },
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false,
    concurrency: Infinity
  });
}

我的test-main.js for requirejs:

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
})

我的节点文件,我设置karma文件,预处理器等基于我从params获得的存储库是这样的:

const cfg     = require('karma').config;
const stopper = require('karma').stopper;
const runner  = require('karma').runner;
const Server  = require('karma').Server;
const path    = require('path');

const REPOSITORY = process.argv[2] || '';
let karmaConfig = cfg.parseConfig(path.resolve('./karma.conf.js'), { port: 9876 } );
let BASE_PATH;

if (REPOSITORY !== 'all') {
    BASE_PATH = `/Users/fernando.delolmo/${REPOSITORY}`;
    karmaConfig.files.push({pattern: BASE_PATH + '/test/**/*.spec.js'});
    karmaConfig.files.push({pattern: BASE_PATH + '/src/**/*.js', included: true});
    karmaConfig.preprocessors[BASE_PATH + '/src/**/*.js']       = ['babel'];
    karmaConfig.preprocessors[BASE_PATH + '/test/**/*.spec.js'] = ['babel'];
    karmaConfig.exclude.push(BASE_PATH + '/node_modules/**/*.spec.js');   
} else {
    BASE_PATH = '/Users/fernando.delolmo/';
    karmaConfig.files.push({pattern: BASE_PATH + '**/test/**/*.spec.js'});
    karmaConfig.files.push({pattern: BASE_PATH + '**/src/**/*.js', included: true});
    karmaConfig.preprocessors[BASE_PATH + '**/src/**/*.js']       = ['babel'];
    karmaConfig.preprocessors[BASE_PATH + '**/test/**/*.spec.js'] = ['babel'];
    karmaConfig.exclude.push(BASE_PATH + '**/node_modules/**/*.spec.js');   
}

karmaConfig.basePath = BASE_PATH;

var server = new Server(karmaConfig, function(exitCode) {
  process.exit(exitCode);
});

server.start();

server.on('browser_start', function() {
    runner.run(karmaConfig, function(exitCode) {
        process.exit(exitCode);
    });
});

server.on('browser_complete', function() {
    stopper.stop(karmaConfig, function(exitCode) {
        process.exit(exitCode);
    });
});

这是我第一次将karma,requirejs和babel一起配置,所以任何帮助都会很棒:)

1 个答案:

答案 0 :(得分:-1)

好的,最后我得到了这里的问题。以防有人在这里找到解决这类问题的方法。

如果你想用带有业力的ES2015模块进行测试,你首先会使用babel来转换成CommonJS模块,这很好!但是......你会得到像导出未定义的错误..而且......为什么?浏览器仍然不支持简单的导出/导入,这意味着您可以在浏览器上运行CommonJS模块,而无需任何模块捆绑器(browersify或webpack)。

所以,请保持清楚:

1st - > Babel只会将您的ES2015代码转换为CommonJS模块并进行测试 第二 - > Webpack / Browersify获取CommonJS模块并将它们捆绑到bundle.js中,然后您可以在karma的浏览器上运行它。