这似乎应该非常简单;然而,经过两个小时的阅读和反复试验没有成功,我承认失败并问你们!
我正在尝试使用Mocha和Should.js来测试一些JavaScript函数,但我遇到了范围问题。我已将其简化为最基本的测试用例,但我无法使其正常工作。
我有一个名为functions.js
的文件,它只包含以下内容:
function testFunction() {
return 1;
}
我的tests.js
(位于同一文件夹中)内容:
require('./functions.js')
describe('tests', function(){
describe('testFunction', function(){
it('should return 1', function(){
testFunction().should.equal(1);
})
})
})
此测试失败并显示ReferenceError: testFunction is not defined
。
我可以看到原因,因为我发现的大多数示例都是将对象和函数附加到Node global
对象或使用module.exports
导出它们 - 但是使用这些方法中的任何一种都意味着我的功能代码会在标准浏览器情况下抛出错误,而这些对象不存在。
那么如何在不使用特定于节点的语法的情况下访问在我的测试的单独脚本文件中声明的独立函数?
答案 0 :(得分:26)
感谢这里的其他答案,我已经有了工作。
有一件事虽未提及 - 也许是因为它在Noders中的常识 - 是你需要将require
调用的结果分配给一个变量,这样你就可以在调用时引用它从测试套件中导出函数。
这是我的完整代码,供将来参考:
<强> functions.js
强>:
function testFunction () {
return 1;
}
// If we're running under Node,
if(typeof exports !== 'undefined') {
exports.testFunction = testFunction;
}
<强> tests.js
强>:
var myCode = require('./functions')
describe('tests', function(){
describe('testFunction', function(){
it('should return 1', function(){
// Call the exported function from the module
myCode.testFunction().should.equal(1);
})
})
})
答案 1 :(得分:17)
require('./functions.js')
由于您没有输出任何内容,因此无法执行任何操作。您期望的是testFunction
是全球可用的,与
global.testFunction = function() {
return 1;
}
你只是不能绕过export / globals机制。这是节点设计的方式。没有隐式的全局共享上下文(如浏览器上的window
)。模块中的每个“全局”变量都被困在它的上下文中。
您应该使用module.exports
。如果您打算与浏览器环境共享该文件,可以使其兼容。要快速入侵,只需在浏览器中window.module = {}; jQuery.extend(window, module.exports)
,或在节点{。1}}。
答案 2 :(得分:6)
如果您想通过要求提供任何模块,请使用
module.exports
如你所知;)
如果你想在Node和浏览器中使用模块,有一个解决方案function testFunction() { /* code */ }
if (typeof exports !== 'undefined') {
exports.testFunction = testFunction
}
通过这样做,您将能够在浏览器和节点环境中使用该文件