我有一个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
对象被污染,并且它不太可能与该对象的另一个定义发生冲突。尽管如此,它仍然没有我想要的那么干净。我希望有人能提供更好的解决方案。
答案 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', ->