我如何使用CoffeeScript模拟现有代码

How do I use CoffeeScript to mock out existing code?

本文关键字:代码 模拟 CoffeeScript 何使用      更新时间:2023-09-26

我想模拟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选项。