具有节点js和require的应对机制

时间:2014-02-22 15:03:17

标签: javascript node.js unit-testing jasmine

尝试使用nodejs和jasmine-node执行客户端javascript的单元测试。 我能够创建窗口和文档变量,$变量,设置环境(使用npm,不要忘记定义NODE_PATH!)。但现在我被困在这上面了。

我想测试的功能在一个模块中。我可以导入(需要)模块,但导入模块的变量无法从nodejs(或jasmine规范文件,因为我想象的相同原因)访问。

这是模块:

var test_module = (function () {
  var init = function () {
    return "toto";
  }

  return { init: init };
})();

在变量test_module中,我们应该找到包含所有导出函数的字典的变量(这里只有一个名为init)。

在nodejs中:

> require('test.js');
{}
> test_module
ReferenceError: test_module is not defined
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.EventEmitter.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

我不确定如何在nodejs中使用作用域。我试着说:

global.test_module = (function () {

这可行,但这不是我想做的。我的javascript应该在浏览器中运行一次测试,全局不会...

旁注:使用命令行,无浏览器和服务器解决方案对客户端javascript进行单元测试,我认为应该得到一个神教程。有一些但是它们通常是不完整的。

1 个答案:

答案 0 :(得分:1)

好的,感谢htatche的回答,我找到了一个解决方法(似乎客户端的javascript单元测试是变通办法之地......):

var test_module = (function () {
  var init = function () {
    return "toto";
  }

  return { init: init };
})();

if(typeof exports != 'undefined'){
    module.exports = test_module;
}

在此解释:http://caolanmcmahon.com/posts/writing_for_node_and_the_browser/
这样我就可以让nodejs和浏览器保持愉快。