如何正确地从 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");
我在 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");