【问题标题】:jasmine tests in karma: Uncaught ReferenceError: require is not defined业力中的茉莉花测试:未捕获的参考错误:未定义要求
【发布时间】:2013-10-07 15:59:37
【问题描述】:

Karma 无法识别 JSFileSpec.js 文件中的 'require' 语句。运行 karma.conf.js:

(function() {
    describe("DummyEmitter creation", function(){
        return it("creation", function(){
            var DummyEmitter = require('Util.DummyEmitter');
            var dummy = new DummyEmitter('someName');
            return expect(dummy).toBeDefined();
        });
    });
})();

ReferenceError: 要求未定义

【问题讨论】:

  • 我来到这里寻找 gulp 解决方案,将frameworks: ['jasmine', 'requirejs'] 添加到karma.conf.js 似乎可以解决它
  • 使用此类框架设置时一定要安装:karma-requirejs 和 requirejs

标签: javascript karma-runner jasmine-node


【解决方案1】:

Karma 是一个测试运行器,可在浏览器中运行您的测试。无论您设置什么浏览器都不知道 require 函数是什么。

要在节点上使用 jasmine,请尝试 jasmine-node。 https://github.com/mhevery/jasmine-node

要让 karma 运行 jasmine 节点测试,请尝试(等待......)jasmine-node-karma。 https://npmjs.org/package/jasmine-node-karma

这是我找到上述信息的 jasmine wiki 页面。 https://github.com/pivotal/jasmine/wiki

希望这会有所帮助。

【讨论】:

  • 是的,这没有帮助。我已经在 karma.conf.js 中配置了 require.js 的路径,但仍然出现“未定义要求”的错误
  • requirejs 与节点 require 函数不一样。看起来您可以设置 requirejs 以在服务器和客户端(浏览器)上工作,但它需要更多设置,然后只需将其添加到路径中。
【解决方案2】:

您可能正在使用 glob 模式,该模式在 karma 的 bin 目录中拾取内容。尝试使用绝对路径执行测试,看看是否可以解决问题。

如果是这样,那么您知道您的 glob 模式正在抓取您不想要的东西。

例如改变

{pattern: '**/**/*_test.js'},

{pattern: 'stuff/dashboard/home-page_test.js'},

看看这是否能解决你的问题。

【讨论】:

  • 为我修复了它,它试图从我的 node_modules 文件夹中获取所有内容
【解决方案3】:

当我尝试在测试用例中使用 require('module_name')(CommonJS 样式模块)并使用 Karma 运行它时,我遇到了同样的问题。

原因是浏览器无法使用require 功能(它是undefined)。为了将它提供给浏览器,我们可以在 Karma 使用 karma-browserify 在浏览器中运行测试用例之前浏览测试 js 文件。

使用npm install karma-browserify --save-dev 安装 karma-browserify

更新 karma.conf.js

 frameworks: ['jasmine', 'browserify'],
 preprocessors: {
    'app/tests/*.js': [ 'browserify' ]
 },
 plugins: [..., 'karma-browserify'],

这些更改后,浏览器化的文件由 Karma 在浏览器中运行,其中定义了require,并且测试用例运行成功

【讨论】:

  • 即使在将 karma-browserify 添加到 plugins 数组之后,我也会收到此错误:错误:“framework:browserify”没有提供程序! (解决:framework:browserify)
  • Karma-Browserfy 需要安装 browserfy。您首先需要 browserfy,因此运行“npm install --save-dev karma-browserify browserify watchify”将解决无提供程序问题。确保遵循预处理器:使用逗号,这样您就不会破坏 karma.conf.js 文件。需要 Watchify 来监视包含的文件的更改。
  • 记得添加插件:[ 'karma-browserify', ... ] 否则,它会报错“无法加载“browserify””,接下来的几个小时你会很沮丧。跨度>
  • @GreatQuestion 我的救星
  • 实际上,将这些版本放在 package.json 中,您不需要添加“plugins”字段。 :D "karma": "^1.7.0", "karma-browserify": "^5.1.1", "karma-chrome-launcher": "^2.2.0", "karma-phantomjs-launcher": " ^1.0.4", "业力茉莉": "^1.1.0",
【解决方案4】:

我今天遇到了类似的问题。就我而言,解决方案非常简单。我通过 Webpack 使用 Babel 来处理 .jsx 文件。带有 .jsx 扩展名的文件确实测试成功,而简单的 .js 文件则引发了引用错误。

如果有人有类似或等效的设置,他们可能能够共享相同的解决方案。

在 karma.config.js 中,我必须为 .js 文件指定预处理器,就像为 .jsx 文件所做的那样。这是一个例子:

preprocessors: {
  "app/tests/**/*.test.jsx": ["webpack", "sourcemap"],
  "app/tests/**/*.test.js": ["webpack", "sourcemap"]
},

我最好补充一点,在我的例子中,Webpack 将代码传递给 Babel 进行编译,以便它可以在浏览器中运行。如果有人需要,我可以复制并粘贴整个 webpack.config.js 和 karma.config.js。

【讨论】:

    【解决方案5】:

    我为此使用 webpack。我在 npm 上发布了我的配置,以便为未来的项目节省时间。只需运行 npm install webpack-karma-jasmine,并按照文档中的描述为 webpack 和 karma 创建配置文件:https://www.npmjs.com/package/webpack-karma-jasmine

    【讨论】:

      【解决方案6】:

      如果有人仍然无法解决上述解决方案,这对我有帮助。 yarn 添加 browserify 和 watchify

      【讨论】:

        【解决方案7】:
          module.exports = function(config) {
            config.set({
        
              basePath: '',
        
        
              frameworks: ['mocha', 'chai'],
        
              files: [
                'test/*.test.js'
              ],
        
              exclude: [
              ],
        
              preprocessors: {
                'test/*.test.js': ['webpack']
              },
        
              webpack: {
                mode: "none",
                module: {
                  rules: [
                    { test: /\.js?$/, loader: "babel-loader",  options: { presets: ["env"] }, }
                  ]
                }
              },
        
              reporters: ['progress'],
        
              port: 9876,
        
              colors: true,
        
              logLevel: config.LOG_INFO,
        
              autoWatch: true,
        
              browsers: ['Chrome'],
        
              singleRun: false,
        
              concurrency: Infinity,
        
              browserNoActivityTimeout: 100000
            })
          }
        

        使用 webpack

        【讨论】:

        • 欢迎来到 StackOverflow。您能否添加更多信息,这是如何解决问题的。
        猜你喜欢
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 2017-01-15
        • 1970-01-01
        • 2014-12-12
        • 2015-04-01
        • 1970-01-01
        相关资源
        最近更新 更多