2011-12-20 85 views
7

我有一個使用以下類(用coffeescript編寫)的javascript自動完成插件:Query,Suggestion,SuggestionCollection和Autocomplete。這些類中的每一個都有用Jasmine編寫的相關規範。如何在不污染全局名稱空間的情況下爲單元測試公開JavaScript對象

該插件模塊內所定義,例如:

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

這防止了類從污染全局命名空間,而且還從任何測試隱藏它們(茉莉花規格,或單元測試的東西,如q-單元)。

在不污染全局名稱空間的情況下公開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

也許暴露了一些內部變量,只?例如:'window.exposedVars = this'(封閉的內部)? – 2011-12-20 01:20:34

+0

我在發佈此文章後幾秒鐘剛添加了我的建議解決方案。這是否符合你的建議? – Mitch 2011-12-20 01:30:28

+0

你的插件如何有用,仍然沒有添加任何東西到全局命名空間?我真的很好奇,也許你正在做一些我不知道的事情。據我所知,必須至少有一個對象出現在全局名稱空間中。 – 2011-12-20 01:38:28

回答

3

我覺得像CommonJS模塊系統(例如使用brunch)可以工作。

您可以將您的代碼分成模塊,並且需要它們的部分將通過require導入它們。唯一被「污染」的部分是由模塊管理代碼維護的模塊映射,與您的test對象非常相似。

Autocomplete.coffee

class exports.Query 
// ... 

class exports.Suggestion 
// ... 

,然後在Autocomplete.spec.coffee

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

describe 'Query', -> 
+0

有趣。之前我沒有看過這個系統。我想這與我所做的事實質上非常相似。對於想要與其他人分享的輕量級插件,我不確定我是否想要投入整個模塊管理系統。不過,早午餐頁面是一個很好的相關閱讀。 – Mitch 2011-12-20 17:35:15

相關問題