2011-06-24 27 views
6

Javascript'te küresel ad alanı genellikle kötü bir şey olarak kabul edilir. Bu nedenle Coffeescript, Javascript'inizin tamamını bir (function() {}).call(this); sarıcıda sarar. Bununla birlikte, Coffeescript kodum için QUnit testleri yazmaya başladım ve QUnit, işlevlerimi bulamadığı için şikayet ediyor.QUnit + coffeescript scope

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 

Değişkenleri global ad alanını kirletmeden test etmek istiyorum. Bunu yapmanın iyi bir yolu nedir? İşte

oluşturulan JavaScript ben testine ister ki:

(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); 

ve benim test.js dosyasıdır:

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")); 
}); 

Teşekkür, Kevin Yani

+0

modülarize gelmez test amaçlı

$ coffee -c -b your_file

için, --bare bayrağıyla kahve dosyasını derlemek. –

+0

Merhaba Aaron, bir örnek ekledim. –

cevap

6

, size istediğiniz demek Küresel ad alanını kirletmeden getGoodNamePart test edin. Ancak, CoffeeScript her dosyayı otomatik olarak modülerleştirir (iyi bir sebeple — bkz. my answer here), yani dosyalara işlevler arasında erişmenin tek yolu bunları bazı genel nesnelere eklemektir. (Böyle Eğer exports kullanmak istiyorum node.js olarak, burada tarayıcı hakkında konuştuğumuzu değil, bir CommonJS ortamı varsayıyorum.)

size üç seçenek sunar Yani:

  1. getGoodNamePart'u window'a ekleyin. Bu, sadece gereken tek değişiklik window. (ya da sadece @) ile getGoodNamePart önekini içermesidir, ancak bu tabii ki ad alanı kirliliğini en üst düzeye çıkarır.
  2. getGoodNamePart, zaten window veya global'a eklenmiş başka bir öğeye ekleyin.
  3. Testlerinizi aynı dosya içinde getGoodNamePart (JS dünyasında alışılmadık bir uygulama olarak dikkate alın, ancak genel ad alanını dokunulmadan ve kodunuz ile testler arasında kolayca geçiş yapabilmenizi sağlayarak) dikkate alın.

Test için yalnızca # 2 ile gitmek istediğinizi, getGoodNamePart gibi işlevlerin dışa aktarılacağını varsayalım. Onları "test hedefleri" olarak adlandırın. Bir test hedefle her dosyanın en üstünde,

window.testTargets ?= {} 

eklemek ve getGoodNamePart tanımladığınızda, sizin QUnit test paketinin üstündeki Sonra

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

yazma yazma

{getGoodNamePart} = testTargets 
Işlevi almak için

.

+0

Harika cevap, teşekkürler Trevor! –

2

Bu Bazı örnek kod yararlı olacaktır derlenmiş kod