Underscore / Coffeescript生成一些奇怪的代码,如何重构代码覆盖?

时间:2014-04-11 07:56:29

标签: javascript coffeescript underscore.js code-coverage

在我的Mocha测试中,我有以下coffeescript:

_u = require "underscore"

...

player._id.toString() in _u.map team._players, (player) ->
  player._id.toString()

这编译为:

var _u,
  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

...

return _ref = player._id.toString(), __indexOf.call(_u.map(team._players, function(player) {
  return player._id.toString();
}), _ref) >= 0;

首先,我根本不理解编译后的代码,它是coffeescript +下划线的工件,有没有办法重写我的代码以避免它?

然而问题是[].indexOf似乎永远是真的,因此|| ...永远不会触发,我在伊斯坦布尔代码覆盖率报告中得到了一个昙花一现。我也很乐意将其排除在伊斯坦布尔的ignore陈述之外,但因为它已经生成,我无法定位它。

1 个答案:

答案 0 :(得分:3)

使用underscore并不重要。

a in b

编译为:

__indexOf.call(b, a) >= 0;

(在Coffeescript.org Try屏幕中尝试此操作。)

Coffeescript定义(这是标准样板文件):

var __indexOf = [].indexOf || function(item) ...

通常这会为[].indexOf提供数组的正常in函数。但是一些旧的浏览器没有这种数组方法([].indexOfundefined)。该表达式的function ...部分通过数组上的循环完成相同的操作。

如果你不想要这块Coffeescript样板,请不要在&#39;中使用&#39;。例如使用:

b.indexOf(a)>=0

可能有一种纯粹使用underscore的方法。