用Jasmine更好地测试coffeescript

时间:2013-09-12 09:06:21

标签: coffeescript jasmine

我最近一直在转向Coffeescript,我认为这是向前迈出的一步(不像你看到的那样)。我遇到的问题是coffeescript类:

class @ComparisonCollection extends Backbone.Collection

编译成

(function() {
  var ComparisonCollection, _ref,
    __hasProp = {}.hasOwnProperty,
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

  ComparisonCollection = (function(_super) {
    __extends(ComparisonCollection, _super);

    function ComparisonCollection() {
      _ref = ComparisonCollection.__super__.constructor.apply(this, arguments);
      return _ref;
    }

    return ComparisonCollection;

  })(Backbone.Collection);

}).call(this);

这意味着,Jasmine无法测试它,除非我在全局命名空间中定义整个类(注意@):

class @ComparisonCollection extends Backbone.Collection

这将对象ComparissonCollection附加到窗口对象(全局命名空间),其中:

  1. 似乎与第一个地方的coffeescript封装相悖
  2. 是一种解决方案,可以更改我的代码以便能够对其进行测试
  3. 如果没有将所有内容都转换为window.something

    ,您有什么更好的建议吗?

1 个答案:

答案 0 :(得分:0)

一种流行的方法是使用浏览器的打包解决方案。我喜欢stitch的简单性。其他流行的替代品包括RequireJS,Browserify和Ender。

这需要以某种方式包装模块。在stitch和Browserify中,这与节点中的完全相同(例如,RequireJS使用的AMD模块略有不同)。

示例:

// collections/comparison.coffee
class ComparisonCollection extends Backbone.Collection

module.exports = ComparisonCollection

使用它(在您自己的应用程序中以及在茉莉花测试中):

ComparisonCollection = require 'collections/comparison'

可替换地:

// collections.coffee
class exports.ComparisonCollection extends Backbone.Collection

使用它:

{ComparisonCollection} = require 'collections'

这也增加了使用jasmine-node进行无头测试的可能性,因此除了在浏览器中进行测试之外,您还可以在构建服务器等时轻松测试所有内容。