我如何使用CoffeeScript模拟现有代码
How do I use CoffeeScript to mock out existing code?
我想模拟MarkdownDeep,我有以下代码,在JavaScript
MarkdownDeep = new (function () {
this.Markdown = function () {
this.Transform = function (a) {
return "html";
};
};
})();
但是我在CoffeeScript
中实现这个有困难我试了下面的
MarkdownDeep = new (->
@Markdown = ->
@Transform = (a) ->
"html"
)()
window.MarkdownDeep = MarkdownDeep
但它不起作用,特别是在我的单元测试markdown = new MarkdownDeep.Markdown()
给出了"未定义的不是一个函数",尽管JS版本模拟得很好。
您的示例产生以下javascript代码:
var MarkdownDeep;
MarkdownDeep = new (function() {
return this.Markdown = function() {
return this.Transform = function(a) {
return "html";
};
};
});
window.MarkdownDeep = MarkdownDeep;
return this.Markdown = function() { /* ... */ }
行使函数成为new
操作符返回的对象。
MarkdownDeep = new (->
@Markdown = ->
@Transform = (a) ->
"html"
return
return
)
window.MarkdownDeep = MarkdownDeep
修复问题。
添加:这个答案提到了javascript中对象构造的算法
CoffeeScript的隐式返回在与new
结合使用时会导致混乱。正如其他人指出的那样,您可以使用显式返回。另一个选择是使用class
,它创建一个没有隐式返回的函数(constructor
):
MarkdownDeep = new class
constructor: ->
@Markdown = class
constructor: ->
@Transform = (a) ->
'html'
当然,在这种情况下,这不是很好读,但作为一般规则,在使用new
时使用class
可以省去麻烦。
您需要显式地为对象/类设置返回值,否则在创建新实例时将返回成员函数。
JS小提琴
MarkdownDeep = new (->
@Markdown = ->
@Transform = (a) ->
"html"
undefined #return undefined instead of this.Transform
undefined #return undefined instead of this.Markdown
)
markdown = new MarkdownDeep.Markdown()
alert markdown.Transform()
编译:
var MarkdownDeep, markdown;
MarkdownDeep = new (function() {
this.Markdown = function() {
this.Transform = function(a) {
return "html";
};
return;
};
return;
});
markdown = new MarkdownDeep.Markdown();
alert(markdown.Transform());
这是Coffeescript给出的输出
var MarkdownDeep;
MarkdownDeep = new (function() {
return this.Markdown = function() {
return this.Transform = function(a) {
return "html";
};
};
});
每个函数的最后一行在Coffeescript中隐式返回。在控制台中检查此操作将产生MarkdownDeep为
function () {
return this.Transform = function(a) {
return "html";
};
}
返回一个没有Markdown()作为方法的函数
CoffeeScript自动将每个输出文件包装在一个匿名函数((function() { ... })()
)中。要禁用此功能,请在运行coffee
时使用--bare
或-b
选项。
相关文章:
- 从桌面读取python文件时高亮显示代码
- 在VanillaJS中模拟模型双向数据绑定
- 如何将函数包装在函数中以避免代码重复
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 货币代码为欧元-金额的格式不应包含小数
- Regex代码只允许一个空格
- 如何将屏幕分辨率乘以 80%,然后在代码中使用
- 从var向代码隐藏函数传递值
- 如何动态插入jquery代码
- 如何在php变量中嵌入JQuery代码
- 代码不会验证
- 带有键代码参数Jquery的模拟按键功能
- 通过代码模拟ctrl+/-
- ES2015测试-模拟和代码覆盖
- 当我更改应用程序代码时,我必须记住更改测试中的模拟函数
- Jquery/Javascript代码模拟键入在谷歌chrome控制台的文本字段
- 我如何使用CoffeeScript模拟现有代码
- box2dweb中的这段代码是如何模拟万有引力的?为什么它使用if语句
- 我可以用jQuery代码模拟点击超链接吗
- 模拟另一个模块中的代码