在Javascript/Coffeescript中,如何模拟模块';测试中的公共功能是什么?

在Javascript/Coffeescript中,如何模拟模块';测试中的公共功能是什么?,javascript,coffeescript,mocking,module-pattern,Javascript,Coffeescript,Mocking,Module Pattern,这就像是函数,而不是变量。我有一个模块,我想模拟其中的一个函数。以下是我的咖啡脚本代码: root = exports ? this root.prod = (-> iWantToBeMocked = -> alert "production" doSomething = -> iWantToBeMocked() return { doSomething: doSomething iWantToBeMocked: iWantToBeMocked

这就像是函数,而不是变量。我有一个模块,我想模拟其中的一个函数。以下是我的咖啡脚本代码:

root = exports ? this

root.prod = (->
  iWantToBeMocked = -> alert "production"
  doSomething = -> iWantToBeMocked()

  return {
    doSomething: doSomething
    iWantToBeMocked: iWantToBeMocked
  }
)()

root.test = (->
  root.prod.iWantToBeMocked = -> alert "I mocked this"
  root.prod.doSomething()

  return {}
)()
这会提醒“生产”,但我想让它提醒“我嘲笑了这个”。我该怎么做

以下是获取输出的javascript:

var root;

root = typeof exports !== "undefined" && exports !== null ? exports : this;

root.prod = (function() {
  var doSomething, iWantToBeMocked;
  iWantToBeMocked = function() {
    return alert("production");
  };
  doSomething = function() {
    return iWantToBeMocked();
  };
  return {
    doSomething: doSomething,
    iWantToBeMocked: iWantToBeMocked
  };
})();

root.test = (function() {
  root.prod.iWantToBeMocked = function() {
    return alert("I mocked this");
  };
  root.prod.doSomething();
  return {};
})();

更新 我已经通过应用我原始问题的答案,找到了自己解决问题的方法:

root = exports ? this

root.prod = (->
  iWantToBeMocked = -> alert "production"
  doSomething = -> this.iWantToBeMocked()

  return {
    doSomething: doSomething
    iWantToBeMocked: iWantToBeMocked
  }
)()

root.test = (->
  root.prod.iWantToBeMocked = -> alert "I mocked this"
  root.prod.doSomething()

  return {}
)()

注意这一行中的
this
doSomething=->this.iWantToBeMocked()
。但这里还有一个问题需要回答。我不明白为什么我必须在这里使用
this
。我想有人给我解释一下在模仿的上下文中,
doSomething=->this.iWantToBeMocked()
doSomething=->iWantToBeMocked()
之间的区别

prod
对象中,有2个对象名为
iWantToBeMocked
。第一个是包含原始警报函数的变量;第二个包含在返回的对象中

root.prod中的
var iWantToBeMocked
是一个私有变量。当您将
root.prod.iwant设置为emocked
时,您正在更改返回的函数,但没有触及私有成员

现在,当你使用

doSomething = -> this.iWantToBeMocked()

doSomething
将查找附加到上下文
this
的方法,该方法恰好是
root.prod
,因此它将调用
root.prod.iWantToBeMocked

而不是调用私有的
iWantToBeMocked
,您是否使用任何类型的测试框架?我不明白你想做什么。@Mathletics我没有使用测试框架。我现在正试图使用纯javascript来测试它,因为我不想自动化这个测试。我正处于游戏开发的实验阶段,我需要看到结果并修改它们。