我在我的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任务中运行我的测试。
答案 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");