如何正确地从 mocha.opts 文件中获取模块

How to properly require modules from mocha.opts file

我在 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 is not defined

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

expect 库确实正在加载,就好像我将路径更改为不存在的东西然后 mocha 说:

"Error: Cannot find module './does-not-exist.js'"

有什么方法可以实现我想要的吗?我正在 运行 我的 gulp 任务测试,如果这可能有帮助的话。

您正确地需要模块,但正如您发现的那样,模块导出的符号不会自动找到全局 space。您可以使用自己的辅助模块来解决这个问题。

创建 test/helper.js:

var expect = require("expect.js")

global.expect = expect;

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

--require test/helper

虽然 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
    });
});

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

我的项目是一个遗留的 JavaScript 应用程序,有很多 "plain" js 文件,我希望在 html 文件中使用脚本标签和使用 require 进行单元测试来引用这些文件加摩卡。

我不确定这是不是很好的做法,但我习惯了 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");