2011-12-20 8 views
7

Mam wtyczkę autouzupełniania javascript, która używa następujących klas (napisanych w coffeescript): Zapytanie, sugestia, kolekcja sugestii i autouzupełnianie. Każda z tych klas ma przypisaną specyfikację napisaną w Jasmine.Jak eksponować obiekty javascript do testowania jednostkowego bez zanieczyszczania globalnej przestrzeni nazw

Wtyczka jest zdefiniowana w module, np:

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

Zapobiega to zajęcia z zanieczyszczających globalnej przestrzeni nazw, ale także ukrywa je od wszelkich prób (specyfikacje z jaśminu lub jednostek testy z czymś takim q-jednostka).

Jaki jest najlepszy sposób na ujawnienie klas javascript lub obiektów do testowania bez zanieczyszczania globalnej przestrzeni nazw?

Będę odpowiedzieć na rozwiązanie, które wymyśliłem, ale mam nadzieję, że jest coś bardziej standardowego.

Aktualizacja: Moja próba Rozwiązanie

Bo jestem NEWB z < 100 XP, nie mogę odpowiedzieć na moje własne pytanie do 8 godzin. Zamiast czekać, dodam tylko to, co tu zrobiłem.

W celu wyspecyfikowania tych klas wymyśliłem obiekt globalny o nazwie _test, w którym odsłoniłem wszystkie klasy w ramach testów. Na przykład, w coffeescript:

class Query 
    // ... 

class Suggestion 
    // ... 

// Use the classes 

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

wewnątrz mojego specyfikacji, a następnie, nie mogę ujawnić klasę jestem testowania:

Query = window._test.Query 

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

Ma to tę zaletę, że tylko przedmiotem _test jest zanieczyszczone, a to jest mało prawdopodobne, że zderzy się z inną definicją tego obiektu. Wciąż nie jest tak czysty, jak bym chciał. Mam nadzieję, że ktoś dostarczy lepsze rozwiązanie.

+0

Może odsłonić trochę zmienną wewnętrzną, tylko? Przykład: 'window.exposedVars = this' (wewnętrzna strona zamknięcia)? –

+0

Właśnie dodałem proponowane rozwiązanie kilka sekund po tym, jak to opublikowałeś. Czy to jest zgodne z tym, co sugerujesz? – Mitch

+0

W jaki sposób Twoja wtyczka jest przydatna i nadal nie dodaje niczego do globalnej przestrzeni nazw? Jestem naprawdę ciekawy, może robisz coś, czego nie jestem świadomy. O ile mogę powiedzieć, zawsze musi istnieć co najmniej jeden obiekt, który dostaje się do globalnej przestrzeni nazw. –

Odpowiedz

3

Myślę, że działa na przykład system modułowy CommonJS (używany np. Pod brunch).

Możesz rozdzielić swój kod na moduły, a części, które ich potrzebują, zaimportują je poprzez require. Jedyną częścią, która zostaje "zanieczyszczona", jest mapa modułu obsługiwana przez kod zarządzania modułem, bardzo podobny do twojego obiektu test.

W Autocomplete.coffee

class exports.Query 
// ... 

class exports.Suggestion 
// ... 

a następnie w Autocomplete.spec.coffee

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

describe 'Query', -> 
+0

Interesujące. Nie oglądałem wcześniej tego systemu. Przypuszczam, że jest to zasadniczo podobne do tego, co zrobiłem. Jeśli chodzi o lekką wtyczkę, którą chcesz udostępnić innym, nie jestem pewien, czy chciałbym rzucić cały system zarządzania modułem. Mimo to strona z brunchem to dobra, trafna lektura. – Mitch

Powiązane problemy