在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来测试它,因为我不想自动化这个测试。我正处于游戏开发的实验阶段,我需要看到结果并修改它们。