这看起来 应该 非常简单;但是,经过两个小时的阅读和反复试验却没有成功,我承认失败并问你们!
我正在尝试将Mocha与Should.js结合使用以测试一些JavaScript函数,但是我遇到了范围界定问题。我已经将其简化为最基本的测试用例,但是我无法使其正常工作。
我有一个名为的文件functions.js,其中仅包含以下内容:
functions.js
function testFunction() { return 1; }
和我tests.js(位于同一文件夹中)的内容:
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。
ReferenceError: testFunction is not defined
我明白了为什么,因为我发现大多数示例都将对象和函数附加到Node global对象或使用导出它们,module.exports但是使用这两种方法都意味着我的函数代码会在标准的浏览器情况下抛出错误,因为这些对象不存在。
global
module.exports
那么,如何在不使用Node特定语法的情况下访问与测试分开的脚本文件中声明的独立函数?
require('./functions.js')
由于您不导出任何内容,因此该操作不会执行任何操作。您所期望的testFunction是全球可用的,基本上与
testFunction
global.testFunction = function() { return 1; }
您只是 无法 绕过导出/全局机制。这是节点的设计方式。没有隐式的全局共享上下文(例如window在浏览器上)。模块中的每个“全局”变量都被包含在其上下文中。
window
您应该使用module.exports。如果您打算与浏览器环境共享该文件,则可以通过多种方法使其兼容。要进行快速黑客攻击,只需window.module = {}; jQuery.extend(window, module.exports)在浏览器中或if (typeof exports !== 'undefined'){ exports.testFunction = testFunction }对于节点执行即可。
window.module = {}; jQuery.extend(window, module.exports)
if (typeof exports !== 'undefined'){ exports.testFunction = testFunction }