【问题标题】:How to properly require modules from mocha.opts file如何从 mocha.opts 文件中正确地要求模块
【发布时间】:2015-09-25 18:48:07
【问题描述】:

我在 mocha 单元测试中使用了 expect.js 库。目前,我需要在每个文件的第一行使用该库,如下所示:

var expect = require('expect.js');

describe('something', function () {
    it('should pass', function () {
        expect(true).to.be(true); // works
    });
});

如果可能,我想从每个文件的第一行删除样板要求代码,并让我的单元测试神奇地了解expect。我想我可以使用mocha.opts 文件来做到这一点:

--require ./node_modules/expect.js/index.js

但现在我在运行测试时收到以下错误:

ReferenceError: 未定义期望

这似乎是有道理的——它怎么知道我的测试中对expect 的引用指的是expect.js 库导出的内容?

expect 库肯定会被加载,就好像我将路径更改为不存在的东西然后 mocha 说:

“错误:找不到模块'./does-not-exist.js'”

有什么方法可以完成我想要的吗?如果可能有帮助的话,我正在从一个 gulp 任务中运行我的测试。

【问题讨论】:

    标签: javascript node.js gulp mocha.js require


    【解决方案1】:

    您正确地需要模块,但正如您所发现的,模块导出的符号不会自动找到自己进入全局空间。您可以使用自己的帮助模块来解决此问题。

    创建test/helper.js:

    var expect = require("expect.js")
    
    global.expect = expect;
    

    并将您的test/mocha.opts 设置为:

    --require test/helper
    

    【讨论】:

      【解决方案2】:

      虽然 Louis 的回答是正确的,但最后我通过使用 karma 和 karma-chai 插件以不同的方法解决了这个问题:

      安装:

      npm install karma-chai --save-dev
      

      配置:

      karma.set({
      
          frameworks: ['mocha', 'chai']
          // ... 
      });
      

      用途:

      describe('something', function () {
          it('should pass', function () {
              expect(true).to.be(true); // works
          });
      });
      

      【讨论】:

        【解决方案3】:

        感谢 Louis 的回答和一些摆弄,我使用 mocha.opts 整理了我的测试环境引用。这是完整的设置。

        我的项目是一个遗留的 JavaScript 应用程序,有很多“普通”的 js 文件,我希望在 html 文件中使用脚本标签和使用 mocha 进行单元测试来引用这些文件。

        我不确定这是否是一种好的做法,但我习惯于 Mocha 在节点项目中进行单元测试,并且渴望使用相同的工具,而且适应度极低。

        我发现导出很简单:

        class Foo{...}
        class Bar{...}
        if (typeof module !== 'undefined') module.exports = { Foo, Bar };
        

        class Buzz{...}
        if (typeof module !== 'undefined') module.exports = Buzz;
        

        但是,尝试在所有文件中使用 require 是一个问题,因为即使包含在 if 块中,浏览器也会抱怨已经声明了变量,例如:

        if (typeof require !== 'undefined') {
            var {Foo,Bar} = require('./foobar.js');    
        }
        

        所以我去掉了文件中的 require 部分,并在我的测试文件夹中设置了一个 mocha.opts 文件,其中包含此内容。路径是相对于根文件夹的:

        --require test/mocha.opts.js
        

        mocha.opts.js 内容。路径是相对于文件位置的:

        global.assert = require('assert');
        global.Foo = require("../foobar.js").Foo;
        global.Bar = require("../foobar.js").Bar;
        global.Buzz = require("../buzz.js");
        

        【讨论】:

          猜你喜欢
          • 2015-05-23
          • 1970-01-01
          • 2011-12-14
          • 2019-09-07
          • 1970-01-01
          • 2015-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多