如何在不污染全局命名空间的情况下公开javascript对象以进行单元测试

时间:2011-12-20 01:08:05

标签: javascript unit-testing testing coffeescript jasmine

我有一个javascript自动完成插件,它使用以下类(用coffeescript编写):Query,Suggestion,SuggestionCollection和Autocomplete。这些类中的每一个都有一个用Jasmine编写的相关规范。

插件在模块中定义,例如:

(function(){
  // plugin...
}).call(this);

这可以防止类污染全局命名空间,但也可以将它们隐藏在任何测试中(使用jasmine进行规范,或使用类似q-unit的单元测试)。

在不污染全局命名空间的情况下,公开javascript类或对象以进行测试的最佳方法是什么?

我会回答我提出的解决方案,但我希望有一些更标准的解决方案。

更新:我尝试的解决方案

因为我是< 100 xp,我无法回答8个小时的问题。而不是等待我只是添加我在这里做的。

为了规范这些类,我发明了一个名为_test的全局对象,我在其中公开了所有类以进行测试。例如,在coffeescript中:

class Query
  // ...

class Suggestion
  // ...

// Use the classes

// Expose the classes for testing
window._test = {
  Query: Query
  Suggestion: Suggestion
}

在我的规范中,我可以透露我正在测试的课程:

Query = window._test.Query

describe 'Query', ->
  // ...

这样做的好处是只有_test对象被污染,并且它不太可能与该对象的另一个定义发生冲突。尽管如此,它仍然没有我想要的那么干净。我希望有人能提供更好的解决方案。

1 个答案:

答案 0 :(得分:3)

我认为像CommonJS模块系统(例如brunch所使用的)会起作用。

您可以将代码分成模块,需要它们的部分将通过require导入它们。得到“污染”的唯一部分是由模块管理代码维护的模块映射,与您的test对象非常相似。

Autocomplete.coffee

class exports.Query
// ...

class exports.Suggestion
// ...

然后在Autocomplete.spec.coffee

{Query, Suggestion} = require 'app/models/Autocomplete'

describe 'Query', ->