如何从mocha.opts文件中正确地要求模块

时间:2015-07-08 03:05:25

标签: javascript node.js gulp mocha require

我在我的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的引用是指expect.js库导出的内容?

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

  

"错误:找不到模块' ./不存在.js'"

有没有办法实现我想要的?如果可能有帮助的话,我可以从gulp任务中运行我的测试。

3 个答案:

答案 0 :(得分:19)

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

创建test/helper.js

var expect = require("expect.js")

global.expect = expect;

并将test/mocha.opts设置为:

--require test/helper

答案 1 :(得分:2)

虽然路易斯的回答很明显,但最后我通过使用业力和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
    });
});

答案 2 :(得分:0)

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

我的项目是一个遗留的JavaScript应用程序,有很多" plain"我希望在html文件中使用脚本标记引用的js文件,并使用require进行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");