QUnit + Coffeescript 作用域

6
在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>", "kev@inburke.com", "email inside carets -> carets get stripped"));
});

谢谢,Kevin

一些示例代码会很有帮助。 - Aaron Dufour
嗨 Aaron,我添加了一个示例。 - Kevin Burke
2个回答

6
所以,你说你想在不污染全局命名空间的情况下测试getGoodNamePart。但是,CoffeeScript会自动将每个文件模块化(有很好的理由-请参见我在这里的答案),这意味着跨文件访问函数的唯一方法是将它们附加到某个全局对象上。(我假设我们在这里谈论的是浏览器,而不是像Node.js这样的CommonJS环境,那里你会使用exports。)
这给你三个选择:
  1. getGoodNamePart附加到window。这是最简单的方法,因为唯一需要更改的是在getGoodNamePart前面加上window.(或者只需使用@),但这当然会最大化命名空间污染。
  2. getGoodNamePart附加到已经附加到windowglobal的其他东西上。
  3. 将您的测试移动到与getGoodNamePart相同的文件中(这是JS世界中不寻常的做法,但值得考虑,因为它保持全局命名空间不受影响,并使您可以轻松地在代码和测试之间切换)。
假设你想选择第二个选项,纯粹出于测试目的导出函数,例如getGoodNamePart。将它们称为“测试目标”。在每个具有测试目标的文件顶部,添加:
window.testTargets ?= {}

当你定义getGoodNamePart函数时,请编写以下内容:
testTargets.getGoodNamePart = getGoodNamePart = (str) ->
  ...

然后,在您的QUnit测试套件顶部编写以下代码:

{getGoodNamePart} = testTargets

获取函数。


2

我使用 --bare 标志编译咖啡文件,以进行测试目的。

$ coffee -c -b 你的文件

这样不会将编译后的代码模块化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接