2011-06-24 45 views
6

Trong Javascript gây ô nhiễm không gian tên chung, thường được coi là một điều xấu. Đây là lý do tại sao Coffeescript kết thúc tốt đẹp tất cả các Javascript của bạn trong một wrapper (function() {}).call(this);.Phạm vi QUnit + coffeescript

Tuy nhiên, tôi đã bắt đầu viết các bài kiểm tra QUnit cho mã Coffeescript của tôi và QUnit phàn nàn rằng nó không thể tìm thấy các chức năng của tôi.

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 

Tôi muốn kiểm tra các biến mà không gây ô nhiễm không gian tên chung. Cách tốt để làm điều này là gì?

Dưới đây là Javascript tạo ra tôi muốn kiểm tra:

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

và tập tin test.js của tôi là:

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

Cảm ơn, Kevin

+0

Một số mã ví dụ sẽ là hữu ích. –

+0

Xin chào Aaron, tôi đã thêm một ví dụ. –

Trả lời

6

Vì vậy, bạn nói rằng bạn muốn kiểm tra getGoodNamePart mà không gây ô nhiễm không gian tên chung. Tuy nhiên, CoffeeScript sẽ tự động mô-đun hóa từng tệp (với lý do chính đáng — xem my answer here), có nghĩa là cách duy nhất để truy cập các chức năng trên các tệp là đính kèm chúng vào một số đối tượng chung. (Tôi giả định rằng chúng ta đang nói về trình duyệt ở đây, không phải là một môi trường CommonJS, chẳng hạn như Node.js, nơi bạn muốn sử dụng exports.)

Cung cấp cho bạn ba lựa chọn:

  1. Đính kèm getGoodNamePart đến window. Điều này là dễ nhất, vì thay đổi duy nhất cần là tiền tố getGoodNamePart với window. (hoặc chỉ @), nhưng tất nhiên điều này tối đa hóa ô nhiễm không gian tên.
  2. Đính kèm getGoodNamePart vào mục khác đã được đính kèm với window hoặc global.
  3. Chuyển các bài kiểm tra của bạn vào cùng một tệp như getGoodNamePart (một thực tế không bình thường trong thế giới JS, nhưng đáng xem xét, vì nó giữ không gian tên chung bị ảnh hưởng và cho phép bạn dễ dàng đi giữa mã của bạn và các bài kiểm tra của bạn).

Giả sử bạn muốn sử dụng # 2, xuất các chức năng như getGoodNamePart hoàn toàn là thử nghiệm. Gọi chúng là "mục tiêu thử nghiệm". Ở phía trên cùng của mỗi tập tin với mục tiêu kiểm tra, thêm

window.testTargets ?= {} 

và khi bạn xác định getGoodNamePart, viết

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

Sau đó ở phía trên cùng của bộ kiểm tra QUnit của bạn, viết

{getGoodNamePart} = testTargets 

để lấy hàm.

+0

Câu trả lời hay, cảm ơn Trevor! –

2

tôi biên dịch tập tin cà phê với cờ --bare, cho mục đích thử nghiệm

$ coffee -c -b your_file

này không modularize biên dịch mã