QUnit coffeescript范围

前端之家收集整理的这篇文章主要介绍了QUnit coffeescript范围前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Javascript污染全局命名空间通常被认为是一件坏事.这就是为什么Coffeescript将所有Javascript包装在(function(){}).call(this);包装.

但是,我已经开始为我的Coffeescript代码编写QUnit测试,而QUnit抱怨它无法找到我的函数.

1. Died on test #1: getGoodNamePart is not defined
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run

我想在不污染全局命名空间的情况下测试变量.这样做的好方法是什么?

这是我要测试的生成的Javascript:

(function() {
getGoodNamePart = function(str) {
    if (str.charAt(0) === '"') {
      str.replace(/" <[^>]+>$"/g,"");
      str.replace(/"/g,"");
      return str;
    } else if (str.charAt(0) === '<') {
      str.replace(/<|>/g,"");
      return str;
    } else {
      return str;
    }
  };
}).call(this);

我的test.js文件是:

test('getGoodNamePart()',function() {
  equals(getGoodNamePart("\"Kev Burke\" <kev@inburke.com>"),"Kev Burke","\"name\" <email> works");
  equals(getGoodNamePart("","","empty string works"));
  equals(getGoodNamePart("kev@inburke.com","kev@inburke.com","raw email works"));
  return equals(getGoodNamePart("<kev@inburke.com>","email inside carets -> carets get stripped"));
});

谢谢,@H_502_17@凯文

解决方法

所以,你说你想测试getGoodNamePart而不污染全局命名空间.但是,CoffeeScript会自动模块化每个文件(有充分理由 – 请参阅 my answer here),这意味着跨文件访问函数的唯一方法是将它们附加到某个全局对象. (我假设我们在这里讨论的是浏览器,而不是CommonJS环境,例如Node.js,你可以在那里使用导出.)

这给你三个选择:

>将getGoodNamePart附加到窗口.这是最简单的,因为唯一需要的更改是将getGoodNamePart添加到窗口前面. (或只是@),但当然这会最大化命名空间污染.@H_502_17@>将getGoodNamePart附加到已附加到窗口或全局的其他内容.@H_502_17@>将您的测试移动到与getGoodNamePart相同的文件中(这是JS世界中的一种不寻常的做法,但值得考虑,因为它保持全局命名空间不变,让您轻松地在代码和测试之间切换).

假设您想要使用#2,将getGoodNamePart等函数导出为纯粹的测试.称他们为“测试目标”.在每个带有测试目标的文件的顶部,添加

window.testTargets ?= {}

当你定义getGoodNamePart时,写

testTargets.getGoodNamePart = getGoodNamePart = (str) ->
  ...

然后在QUnit测试套件的顶部写上

{getGoodNamePart} = testTargets

获得这个功能.

猜你在找的JavaScript相关文章