如何使用Mochatesting“正常”(非特定于Node的)JavaScript函数?

这似乎应该是非常简单的; 但是,经过两个小时的阅读和试​​错,没有成功,我承认失败,问你们!

我正在尝试使用Mocha和Should.js来testing一些JavaScript函数,但是我遇到了范围问题。 我把它简化为最基本的testing用例,但是我无法得到它的工作。

我有一个名为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); }) }) }) 

这个testing失败了一个ReferenceError: testFunction is not defined

我可以看到为什么,因为我发现的大多数示例都将对象和函数附加到Node global对象,或者使用module.exports将其module.exports – 但是使用这些方法中的任何一种都意味着我的函数代码会在标准浏览器情况下抛出错误,那些对象不存在。

那么,如何在不使用特定于Node的语法的情况下访问我的testing中单独的脚本文件中声明的独立函数呢?

 require('./functions.js') 

由于你没有输出任何东西,所以不会做任何事情。 你所期望的是testFunction是全局可用的,基本上和

 global.testFunction = function() { return 1; } 

不能绕过导出/全局机制。 这是节点devise的方式。 没有隐式的全局共享上下文(如浏览器上的window )。 模块中的每个“全局”variables都被困在上下文中。

你应该使用module.exports 。 如果您打算与浏览器环境共享该文件,可以使其兼容。 对于一个快速的黑客只是做window.module = {}; jQuery.extend(window, module.exports) window.module = {}; jQuery.extend(window, module.exports)在浏览器中,或者if (typeof exports !== 'undefined'){ exports.testFunction = testFunction }

感谢这里的其他答案,我有事情的工作。

有一件事没有被提及 – 可能是因为它是Node的常识 – 就是你需要把require调用的结果赋给一个variables,以便在testing套件中调用你导出的函数的时候可以引用它。

以下是我的完整代码,供将来参考:

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

如果你想通过要求使任何模块可用,你应该使用

 module.exports 

如你所知 ;)

如果你想在节点和浏览器中使用一个模块,就有一个解决scheme

 function testFunction() { /* code */ } if (typeof exports !== 'undefined') { exports.testFunction = testFunction } 

通过这样做,您将能够在浏览器和节点环境中使用该文件