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

Mit*_*tch 7 javascript testing unit-testing coffeescript jasmine

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

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

(function(){
  // plugin...
}).call(this);
Run Code Online (Sandbox Code Playgroud)

这可以防止类污染全局命名空间,但也可以将它们隐藏在任何测试中(使用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
}
Run Code Online (Sandbox Code Playgroud)

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

Query = window._test.Query

describe 'Query', ->
  // ...
Run Code Online (Sandbox Code Playgroud)

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

Thi*_*ilo 3

我认为像 CommonJS 模块系统(例如brunch使用的)这样的东西可以工作。

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

Autocomplete.coffee

class exports.Query
// ...

class exports.Suggestion
// ...
Run Code Online (Sandbox Code Playgroud)

然后在Autocomplete.spec.coffee

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

describe 'Query', ->
Run Code Online (Sandbox Code Playgroud)