2011-06-24 15 views
6

W języku Javascript zanieczyszczanie globalnej przestrzeni nazw jest ogólnie uważane za złe. Właśnie dlatego Coffeescript opakowuje całą twoją JavaScript w opakowaniu (function() {}).call(this);.Zakres QUnit + coffeescript

Jednak zacząłem pisać testy QUnit dla mojego kodu Coffeescript, a QUnit narzeka, że ​​nie może znaleźć moich funkcji.

1. Died on test #1: getGoodNamePart is not defined 
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run 

Chciałbym przetestować zmienne bez zanieczyszczania globalnej przestrzeni nazw. Jaki jest dobry sposób na zrobienie tego?

tutaj jest generowany JavaScript Chcę testu:

(function() { 
getGoodNamePart = function(str) { 
    if (str.charAt(0) === '"') { 
     str.replace(/" <[^>]+>$"/g, ""); 
     str.replace(/"/g, ""); 
     return str; 
    } else if (str.charAt(0) === '<') { 
     str.replace(/<|>/g, ""); 
     return str; 
    } else { 
     return str; 
    } 
    }; 
}).call(this); 

i mój plik test.js jest:

test('getGoodNamePart()', function() { 
    equals(getGoodNamePart("\"Kev Burke\" <[email protected]>"), "Kev Burke", "\"name\" <email> works"); 
    equals(getGoodNamePart("", "", "empty string works")); 
    equals(getGoodNamePart("[email protected]", "[email protected]", "raw email works")); 
    return equals(getGoodNamePart("<[email protected]>", "[email protected]", "email inside carets -> carets get stripped")); 
}); 

Dzięki, Kevin

+0

Niektóre przykładowy kod byłoby pomocne. –

+0

Cześć Aaron, dodałem przykład. –

Odpowiedz

6

Więc mówisz, że chcesz test getGoodNamePart bez zanieczyszczania globalnej przestrzeni nazw. Ale, CoffeeScript automatycznie modularyzuje każdy plik (nie bez powodu - patrz: my answer here), co oznacza, że ​​jedynym sposobem uzyskania dostępu do funkcji w plikach jest dołączenie ich do jakiegoś globalnego obiektu. (Zakładam, że mówimy o przeglądarce tutaj, a nie środowisko CommonJS, takich jak node.js, gdzie chcesz wykorzystać exports.)

To daje trzy opcje:

  1. Dołącz getGoodNamePart do window. Jest to najłatwiejsze, ponieważ jedyną potrzebną zmianą jest przedrostek getGoodNamePart z window. (lub po prostu), ale oczywiście maksymalizuje to zanieczyszczenie przestrzeni nazw.
  2. Dołącz getGoodNamePart do czegoś innego, co jest już dołączone do window lub global.
  3. Przenieś testy wewnątrz tego samego pliku co getGoodNamePart (niezwykła praktyka w świecie JS, ale warto wziąć pod uwagę, ponieważ zachowuje ona globalną przestrzeń nazw nietkniętą i pozwala łatwo przechodzić między kodem a testami).

Załóżmy, że chcesz przejść z # 2, eksportując funkcje takie jak getGoodNamePart wyłącznie do testowania. Nazwij ich "celami testowymi". Na górze każdego pliku z cel testu, dodać

window.testTargets ?= {} 

i podczas definiowania getGoodNamePart, pisać

testTargets.getGoodNamePart = getGoodNamePart = (str) -> 
    ... 

Następnie na górze QUnit testowych, pisać

{getGoodNamePart} = testTargets 

, aby uzyskać funkcję.

+0

Świetna odpowiedź, dzięki Trevor! –

2

skompilować plik kawy z --bare flagą, dla celów testowania

$ coffee -c -b your_file

to nie zmodularyzowanie kod skompilowany