首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与Karma + RequireJS + Jasmine的“错误:不匹配的匿名定义()”

与Karma + RequireJS + Jasmine的“错误:不匹配的匿名定义()”
EN

Stack Overflow用户
提问于 2015-06-29 06:56:52
回答 2查看 6.3K关注 0票数 8

我现在被困了一段时间,试图设置单元测试并运行。

我有一个AngularJS前端,其中装载了RequireJS和r.js,并对其进行了优化,因此所有这些都很好地放在一个文件中。这行得通!

不起作用的是执行单元测试。到目前为止,这并没有什么特别之处,只是从一个教程中复制了一个初学者。

tests/user/user.test.js

代码语言:javascript
运行
复制
define(['angular', 'angular-mocks', 'app'], function(angular, app) {
  describe('Unit: UserController', function() {
    beforeEach(module('user.app'));

    it('should do something', function() {
      console.log('did it');
    });
  });
});

那我就有karma.conf.js

代码语言:javascript
运行
复制
module.exports = function(config) {
  config.set({
    logLevel: config.LOG_DEBUG,
    basePath: './',

    files: [
      // r.js'd app files
      {pattern: 'dist/app.js', included: false},
      // the tests
      {pattern: 'tests/**/*.test.js', included: true},
    ],

    excluded: ['tests/main.test.js']

    frameworks: ['jasmine', 'requirejs'],

    browsers: ['PhantomJS'],

    plugins: [
      'karma-jasmine',
      'karma-junit-reporter',
      'karma-phantomjs-launcher',
      'karma-requirejs'
    ],

  });
};

一个main.test.js

代码语言:javascript
运行
复制
var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

var pathToModule = function(path) {
  var returnValue = path.replace(/^\/base\//, '').replace(/\.js$/, '');
  return returnValue;
};

Object.keys(window.__karma__.files).forEach(function(file) {
  if (TEST_REGEXP.test(file)) {
    // Normalize paths to RequireJS module names.
    allTestFiles.push(pathToModule(file));
  }
});

require.config({
  baseUrl: '/base',

  paths: {
    'angular-mocks': 'node_modules/angular-mocks/angular-mocks',
    'app': 'dist/app',
  },

  deps: allTestFiles,

  callback: function() {
    console.log('load complete');
    window.__karma__.start();
  },
});

最后是一个gulp任务:

代码语言:javascript
运行
复制
var gulp  = require('gulp');
var karma = require('karma').server;

gulp.task('unit-test', function(done) {
  karma.start({
    configFile: __dirname + '/karma.conf.js',
      singleRun: true
   }, function() { done(); });
}

在这里和那里,我添加了一些日志输出,它显示文件是加载的。

但是我被困在了Error: Mismatched anonymous define()tests/user/user.test.js里,我不知道是怎么回事。这是输出:http://pastebin.com/evJPj9B3

如果我将单元测试模块命名为

代码语言:javascript
运行
复制
define('namedtestorso', ['angular', 'angular-mocks', 'app'], function(angular, app) {
  ...

..。我不再有错误了,但是测试没有执行。由于我可以回忆的所有例子,使用它作为匿名定义,我认为命名是不正确的这里。但是在这种情况下,日志输出将被执行,显示来自main.test.js的配置回调被执行了两次。(这是个暗示吗?)

如果有人知道如何修复它/让它运行,甚至是如何继续找出问题所在,那就太好了。提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-01 07:09:35

我现在正在运行它,所以将我的解决方案留在这里:

我想我现在更了解karma是如何工作的(如果我错了,请告诉我),所以我找到了我必须做的事情。

这似乎完全是为了将文件放入karma.conf.js,这样就可以加载main.test.js了。否则,它们就脱离了“上下文”,无法被访问。但是,当放入其中时,请确保将included标志设置为false

karma.conf.js的更改

代码语言:javascript
运行
复制
files: [
  ...
  // Also included these dependencies. All the others are minified in the
  // app.js but if you don't do that, also include all project deps like
  // AngularJS etc.
  { pattern: 'node_modules/jasmine-core/lib/jasmine-core/boot.js', included: false },
  { pattern: 'node_modules/angular-mocks/angular-mocks.js', included: false},

  // Then I had an error in my pattern ('tests/**/*.test.js')
  // Only the `main.test.js` is supposed to be included!
  { pattern: 'tests/user/user.test.js', included: false }
  { pattern: 'tests/main.test.js', included: true }
  ...

如果我是正确的,Karma将创建一个included: true文件,并通过脚本标记加载文件。这就是为什么如果使用RequireJS,重要的是将include设置为false,因为这样做会得到Error: Mismatched anonymous define()。所以这对我来说是有意义的。

在解决了这个问题之后,其他的模块就找不到了。因为我使用了RequireJS优化器,所以我必须将我的所有模块“映射”到主app.js文件中,以便当测试JS文件需要某个模块时,RequireJS可以确保它已经加载(或得到)。

因此,我最终更改了main.test.js中的main.test.js部分

代码语言:javascript
运行
复制
paths: {
  // Added these for example
  'angular': '../dist/app',
  'angular-ui-router': '../dist/app',
  // (and also my project modules)
  ...

好吧,这听起来有点烦人。同时,在解决了这个问题之后,我还将我的工作流程更改为在dev文件上运行单元测试,并依赖其他工具正常工作(如果不是,则由e2e测试捕获问题)。

希望它能帮助我的处境中的其他人!

票数 11
EN

Stack Overflow用户

发布于 2016-02-03 10:45:46

准确地说,如果您转到requirejs站点,此错误声明如果您在html中包含了任何脚本标记,这意味着由业力提供的html。

因此,在karma.conf.js中,当您包含像:karma.conf.js这样的文件时,我认为它是作为脚本标记添加的,并且您继续获取错误:不匹配的匿名定义()模块

尝试模式示例:{ pattern:‘/base/src/ script /xyz.js’,包括: false},它防止在脚本标记中添加js

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31109522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档